http://blog.csdn.net/boboyuwu/article/details/77148302
首先分析的入口
removeAndRecycleView
/**
* Remove a child view and recycle it using the given Recycler.
*
* @param child Child to remove and recycle
* @param recycler Recycler to use to recycle child
*/
public void removeAndRecycleView(View child, Recycler recycler) {
removeView(child);
recycler.recycleView(child);
}
recycler.recycleView(child);
public void recycleView(View view) {
......
recycleViewHolderInternal(holder);
}
recycleViewHolderInternal mViewCacheMax=2
void recycleViewHolderInternal(ViewHolder holder) {
......
int cachedViewSize = mCachedViews.size();
if (cachedViewSize >= mViewCacheMax && cachedViewSize > 0) {
recycleCachedViewAt(0);
cachedViewSize--;
}
......
}
recycleCachedViewAt
void recycleCachedViewAt(int cachedViewIndex) {
......
addViewHolderToRecycledViewPool(viewHolder, true);
mCachedViews.remove(cachedViewIndex);
}
addViewHolderToRecycledViewPool
void addViewHolderToRecycledViewPool(ViewHolder holder, boolean dispatchRecycled) {
......
getRecycledViewPool().putRecycledView(holder);
}
putRecycledView mMaxScrap=5
public void putRecycledView(ViewHolder scrap) {
final int viewType = scrap.getItemViewType();
final ArrayList<ViewHolder> scrapHeap = getScrapDataForType(viewType).mScrapHeap;
if (mScrap.get(viewType).mMaxScrap <= scrapHeap.size()) {
return;
}
......
scrapHeap.add(scrap);
}
以上为recyclerview对滑出的子view进行的大致操作
关注点:
- 容器有两种
- ArrayList<ViewHolder> mCachedViews
- SparseArray<ScrapData> mScrap
static class ScrapData {
ArrayList<ViewHolder> mScrapHeap = new ArrayList<>();
int mMaxScrap = DEFAULT_MAX_SCRAP;//5
long mCreateRunningAverageNs = 0;
long mBindRunningAverageNs = 0;
}
SparseArray<ScrapData> mScrap = new SparseArray<>();
2 .移除的view流程,首先进入mCachedViews,
- 当mCachedViews容器装满之后,
- 按照FIFO(先进先出)规则出栈,
- 然后根据类型进入mScrap的mScrapHeap中,
- 当该类型的mScrapHeap容器装满之后,任由该view自生自灭
网友评论