关于BaseAdapter的基础知识我们在这里就不讲解了:
getItemViewType() 和 getItemTypeCount()作用:
@Override
public int getItemViewType(int position) {
Message msg = myList.get(position);
int type = msg.getType();
Log.e("TYPE:", "" + type);
return type;
}
@Override
public int getViewTypeCount() {
return 7;
}
在ListView的父类AbsListView中,有一个变量RecycleBin mRecycler,用来存储某一显示项布局对应的视图。实际存储在 ArrayList<View>[] 中,该数组的长度为getViewTypeCount的返回值。RecycleBin 是AbsListView的一个内部类。
当ListView执行 setAdapter方法时,mRecycler会重置,getViewTypeCount方法会被调用。
当ListView要显示某一项时,getItemViewType方法被调用,根据返回值在mRecycler搜索得到缓存的视图。这也是为什么getViewTypeCount返回值要比定义的视图类型常量值大的原因,否则会导致数组越界异常。
然后调用getView方法,缓存的视图被传递给getView方法的convertView形参(详细可以参考AbsListView的obtainView方法)。
当传递进来的convertView形参为null的话,需要根据该项的视图类型,初始化布局。
最后给显示项填充数据。