复用:从集合中去获取
入口一: 滑动 Move 事件 --> scrollByInternal --> scrollStep --> mLayout.scrollVerticallyBy --> scrollBy --> fill --> layoutChunk --> layoutState.next获取缓存的view --> addView(view);
layoutState.next --> getViewForPosition --> tryGetViewHolderForPositionByDeadline -->
怎么从集合中去获取:tryGetViewHolderForPositionByDeadline,分几种情况去获取ViewHolder
- getChangedScrapViewForPosition -- mChangeScrap 与动画相关
- getScrapOrHiddenOrCachedHolderForPosition -- mAttachedScrap 、mCachedViews
- getScrapOrCachedViewForId -- mAttachedScrap 、mCachedViews (ViewType,itemid)
- mViewCacheExtension.getViewForPositionAndType -- 自定义缓存 -- (使用情况:局部刷新)
- getRecycledViewPool().getRecycledView -- 从缓冲池里面获取
RecycledViewPool -- 缓存池
ViewHolder -- 包装View的 --- ItemView
当没有缓存的时候??--- mAdapter.createViewHolder --》 onCreateViewHolder
多级缓存的目的 -- 为了性能
创建ViewHolder 后 绑定: tryBindViewHolderByDeadline--》 mAdapter.bindViewHolder--》onBindViewHolder
入口二: RecyclerView.onLayout --> dispatchLayout --》 dispatchLayoutStep2 --》 onLayoutChildren --》 fill --》layoutChunk --> layoutState.next --> recycler.getViewForPosotion --> getViewForPosition --> tryGetViewHolderForPsitionByDeadline
缓存
入口一:
LinearLayoutManager.onLayoutChildren --> detachAndScrapAttachedViews --> scrapOrRecycleView--
--> 1.recycler.recycleViewHolderInternal(viewHolder); -- 处理 CacheView 、RecyclerViewPool 的缓存
--> 1.1.ViewHodler改变 不会进来 -- 先判断mCachedViews的大小 --> mCachedViews.size 大于默认大小 --- recycleCachedViewAt --- >addViewHolderToRecycledViewPool --- 缓存池里面的数据,在这个逻辑分支都是从mCachedViews里面出来的,缓存mCachedViews里面最老的ViewHolder,mCachedView默认容量为2,mChachedView保存的是进过bind数据的ViewHolder
--> 1.2.addViewHolderToRecycledViewPool(存在直接把ViewHolder缓存到pool的逻辑分支) --> getRecycledViewPool().putRecycledView(holder)--> scrap.resetInternal(); ViewHolder状态数据清空后再保存。scrap是一个SparseArray结构,键为viewType,值中包含一个ViewHolder的ArrayList,list容量为5
--> 2.recycler.scrapView(view); 处理mAttachedScrap, mChangedScrap
入口二: 缓存:fill -->recycleByLayoutState-->recycleViewsFromStart --> recycleChildren --> removeAndRecycleViewAt --> recycler.recycleView --> recycler.recycleViewHolderInternal(viewHolder); -- 处理 CacheView 、RecyclerViewPool 的缓存
自定义LayoutManager