RecyclerView四级缓存

364 阅读1分钟

image.png

复用:从集合中去获取

入口一: 滑动 Move 事件 --> scrollByInternal --> scrollStep --> mLayout.scrollVerticallyBy --> scrollBy --> fill --> layoutChunk --> layoutState.next获取缓存的view --> addView(view);

layoutState.next --> getViewForPosition --> tryGetViewHolderForPositionByDeadline -->

怎么从集合中去获取:tryGetViewHolderForPositionByDeadline,分几种情况去获取ViewHolder

  1. getChangedScrapViewForPosition -- mChangeScrap 与动画相关
  2. getScrapOrHiddenOrCachedHolderForPosition -- mAttachedScrap 、mCachedViews
  3. getScrapOrCachedViewForId -- mAttachedScrap 、mCachedViews (ViewType,itemid)
  4. mViewCacheExtension.getViewForPositionAndType -- 自定义缓存 -- (使用情况:局部刷新)
  5. 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