缓存什么?复用什么? ----答:缓存ViewHolder 即 包装View的 也就是一个个ItemView(条目)
所谓缓存,就是看RecyclerView 怎么往四级缓存中添加数据的
缓存与复用
意思是,直接从mCachedViews 里取322 323, 不会调用onBindViewHodler
而页面外的318 319 会被提前绑定,及执行了onBinderViewholder
详细流程:
1)复用
----> 从触摸touch 方法的ACTION_MOVE 开始
1. getChangedScrapViewForPosition-----从集合 mChangedScrap取 (根据position、StableId)
2. getScrapOrHiddenOrCachedHolderForPosition ----从集合 mAttachedScrap、mCachedViews取(根据Position复用)
3. getScrapOrCachedViewForId ----从集合 mAttachedScrap、mCachedViews取(根据StableId 复用)
4. mViewCacheExtension.getViewForPositionAndType -----> 自定义复用,缓存需要自己实现
5. getRecycledViewPool().getRecycledView
6. mAdapter.createViewHolder --> onCreateViewHolder 的作用 创建 ViewHolder 对象,onCreateViewHolder调用时机
从上面的缓存中,拿到了viewholder, 则接下来执行绑定 onBinderViewHolder()
2)保存/缓存-------保存再mCachedView 和 pool 里
执行复用之前,先有执行保存/缓存的方法,即在recycleByLayoutState(recycler, layoutState)方法里执行保存
1)如果 mCachedView集合的元素个数大于2
a: 保存到pool中:addViewHolderToRecycledViewPool(viewHolder, true); // 添加到Pool中
2)如果 mCachedView集合的元素个数小于等于 2
b: 保存到mCachedViews集合了,即添加到mCachedViews中
3)保存/缓存------保存在mChangeScrap 和 mAttachedScrap 里
就是在布局的时候,开始取保存/缓存的
================================================================
以下是之前的(历史编辑的)
当没有缓存的时候??
--- mAdapter.createViewHolder --> onCreateViewHolder
创建ViewHolder 后 绑定: tryBindViewHolderByDeadline --> mAdapter.bindViewHolder--> onBindViewHolder
一: 缓存流程
缓存入口1:
缓存入口2: