在使用不同布局的时候,getItemViewType和getViewType不能少,通常是不用这两个函数的重载的
listView.setAdapter(new BaseAdapter() { @Override
public int getViewTypeCount() {//例:3种类型的布局 return 3;
} @Override
public int getItemViewType(int position) { //该方法很重要。adapter内部会自己主动调用该方法。然后依据该类型得到缓存的view(可能为null),并传给getView方法//的convertView參数,假设该类型相应的view已被缓存过,则getView中的convertView就不为null
//返回的类型要小于getViewTypeCount(),否则会报数组越界
if (position==20||position==40||position==60) {
return 1;
}
if (position==25||position==45||position==65) {
return 2;
} return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
int type=getItemViewType(position);
System.out.println("getView "+position+" "+convertView+" "+type);
if (convertView==null) {
if (type==0) {
TextView tv=new TextView(getApplicationContext());
tv.setText(""+position);
tv.setPadding(20, 20, 20, 20);
tv.setTextColor(Color.BLACK); convertView=tv; }else if(type==1){
TextView tv=new TextView(getApplicationContext());
tv.setText(""+position);
tv.setPadding(20, 10, 10, 10);
tv.setTextColor(Color.BLACK);
tv.setBackgroundColor(Color.GREEN);
convertView=tv; }else{
ImageView iv=new ImageView(getApplicationContext());
iv.setImageResource(R.drawable.ic_launcher);
convertView=iv;
} }
switch (type) { //依据类型就能够大胆的强转了,不会抛异常的
case 0:
TextView tv=(TextView) convertView;
tv.setText(""+position);
break;
case 1:
tv=(TextView) convertView;
tv.setText(""+position);
break;
case 2:
ImageView iv=(ImageView) convertView; break; }
return convertView;
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
} @Override
public int getCount() {
// TODO Auto-generated method stub
return 5000;
}
}); // 为了验证getView的convertView參数是我们想要的view, 控件高度要高一些。保证同一屏不会出现两个绿色背景textview或imageview //能够看到20 25位置是第一次出现绿色背景textview和imagerview的位置,相应的convertView为null,40 45位置相应的convertView不为null。传进来的是已经缓存过的view