RecyclerView 缓存与复用机制

缓存什么?复用什么? ----答:缓存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:

二 :复用流程(从缓存中去获取,即从集合中去获取)

复用入口1:

复用入口2:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值