在AbsListview中,定义内部类 class RecycleBin;
private ArrayList<View>[] mScrapViews; //定义一个list数组,回收不同类型的view。
private int mViewTypeCount; //定义回收处理view类型的个数。private ArrayList<View> mCurrentScrap; // 当view类型就只有一种时,维护回收的view。
在下面的源码中能看出上面3个成员变量的初始化。
public void setViewTypeCount(int viewTypeCount) {
if (viewTypeCount < 1) {
throw new IllegalArgumentException("Can't have a viewTypeCount < 1");
}
//noinspection unchecked
ArrayList<View>[] scrapViews = new ArrayList[viewTypeCount];
for (int i = 0; i < viewTypeCount; i++) {
scrapViews[i] = new ArrayList<View>();
}
mViewTypeCount = viewTypeCount;
mCurrentScrap = scrapViews[0];
mScrapViews = scrapViews;
}
RecycleBin
ArrayList<View>[] mScrapViews 缓存多个类型view的list。
convertview取得的时候,就调用了getItemViewType()的,去指定缓存list的数据,没有才返回null。有的话,直接可使用了。
其实就是listview里面已经实现了View类型的判断,只要你重写了
getItemViewType()这个方法,就不会出现转换问题。
View getScrapView(int position) {
if (mViewTypeCount == 1) {
return retrieveFromScrap(mCurrentScrap, position);
} else {
int whichScrap = mAdapter.getItemViewType(position);
if (whichScrap >= 0 && whichScrap < mScrapViews.length) {
return retrieveFromScrap(mScrapViews[whichScrap], position);
}
}
return null;
}