RecyclerView的复用和回收机制

ListView复用及回收

AbsListView.RecycleBin

RecycleBin维护了两种类型列表

一种用于保存屏幕上可见的view,一种用于缓存滚动出屏幕的view

滚动时,子view完全滑出屏幕,保存在RecycleBin,子View进入屏幕,从RecycleBin中获取缓存view,进行数据绑定

 

RecyclerView 复用及回收

四级缓存机制

内部有Recycler内部类

onCreateViewHolder()  onBindViewHolder()

复用机制

getViewForPosition(int position)

 

tryGetViewHolderForPositionByDeadline()  Recycler的复用机制内部实现在这个方法里

mAttachedScrap   用于缓存显示在屏幕上的item的ViewHolder,场景是

mChangedScrap  

mCachedViews  滑动中的回收和复用处理这个,可以直接添加到RecyclerView中显示,不需要重新onBindViewHolder

mCachedViews 的大小默认为2 .  遍历mCachedViews 

mRecyclerPool  存放在这里的viewhodler的数据信息会被重置掉,所以需要重新调用onBindViewHolder来绑定数据

 

mViewCacheExtension  留给我们自己扩展的
 

mCachedViews 的大小默认为2 .  遍历mCachedViews 

 先判断mCacheView是否已经满了  如果已满会通过recycleCacheViewAt(0)把最老的放入RecyclerPool , 然后再把新的放进mCacheViews中,如果试图不符合条件就直接放进

RecyclerPool中.在进mCacheViews之前, 我们的视图只是被remove掉了,绑定的数据等信息还在. 

复用逻辑在tryGetViewHolderForPositionByDeadLine()中

mState.isPreLayout() 为true 那么去mChageScrap中找holder  (滑动过程中为false)

 

由LayoutManager 来遍历移除屏幕的viewholder ,回收时 都是把Viewholder放在mCacheViews里面,如果mCacheViews满了,那就在mCacheViews里找到下标为0最老的放入RecyclePool里

RecycleView滑动时,会交由LinearLayoutManager的scrollVerticallyBy()去处理, 然后LayoutManager会调用fill()方法去回收复用Viewholder

Recycler中每个viewtype的maxScrap默认为5  也就是每种viewholder的缓存容量为5

 

有个文章写得很好

https://www.jianshu.com/p/40820ea48457

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值