在使用不同布局的时候,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