public void removeAndRecycleViewAt(int index, @NonNull Recycler recycler) {
final View view = getChildAt(index);
removeViewAt(index);
recycler.recycleView(view); //1
}
5、Recycler -> recycleView
如下所示,注释1处表示又会调用recycleViewHolderInternal;
public void recycleView(@NonNull View view) {
、、、
recycleViewHolderInternal(holder); //1
}
6-1 RecyclerView # Recycler
在分析recycleViewHolderInternal方法之前,我们先简单分析一下RecyclerView的两个内部类Recycler类和RecyclerViewPool;
RecyclerView # Recycler
Recycler如下所示,注释1和注释2是一级缓存,其实就是泛型为ViewHolder的ArrayList;注释3就是二级缓存,注释4处的mViewCacheMax表示二级缓存的最大容量为2;注释5就是四级缓存RecycledViewPool;注释6就是第三级缓存,也就是自定义缓存;
public final class Recycler {
final ArrayList mAttachedScrap = new ArrayList<>(); //1
ArrayList mChangedScrap = null; //2
final ArrayList mCachedViews = new ArrayList(); //3
private final List
mUnmodifiableAttachedScrap = Collections.unmodifiableList(mAttachedScrap);
private int mRequestedCacheMax = DEFAULT_CACHE_SIZE;
int mViewCacheMax = DEFAULT_CACHE_SIZE; //4
RecycledViewPool mRecyclerPool; //5
private ViewCacheExtension mViewCacheExtension; //6
static final int DEFAULT_CACHE_SIZE = 2; //7
、、、
}
RecyclerView # RecycledViewPool
RecycledViewPool如下所示,先看注释2处的内部类ScrapData,注释3处的mScrapHeap就是缓存ViewHolder的ArrayList,注释4处表示最大容量为5,即可以缓存ViewHolder的个数为5;注释5处mScrap是一个SparseArray,其泛型为内部类ScrapData,这表示什么意思呢?就是说RecyclerViewPool对每种类型的ViewHolder最大缓存个数为5,然后可以缓存多种ViewHolder类型;
public static class RecycledViewPool {
private static final int DEFAULT_MAX_SCRAP = 5; //1
static class ScrapData { //2
final ArrayList mScrapHeap = new ArrayList<>(); //3
int mMaxScrap = DEFAULT_MAX_SCRAP; //4
long mCreateRunningAverageNs = 0;
long mBindRunningAverageNs = 0;
}
SparseArray mScrap = new SparseArray<>(); //5
、、、
}
6-2 Recycler -> recycleViewHolderInternal
在recycleViewHolderInternal方法中才是执行真正的回收操作,主要是使用第二级缓存mCachedViews和第四级缓存RecyclerViewPool;注释1、2处表示mCachedViews容量满了之后会调用recycleCachedViewAt方法,然后将size–;注释3处表示往mCachedViews添加;注释