RecycleView源码解析

LayoutManager mLayout;

mylayout实际上是LinearLayoutManager

recycleView的设计实际上就是在不同的场景下传入不同的实现类就可以实现不同的效果

final boolean canScrollHorizontally = mLayout.canScrollHorizontally();

final boolean canScrollVertically = mLayout.canScrollVertically();

复用流程

move动作里面

调用了scrollByInternal

scrollByInternal调用了scrollStep

scrollStep调用了scrollStep

scrollStep调用了LinearLayoutManager中的scrollHorizontallyBy/scrollVerticallyBy

实际上scrollHorizontallyBy和scrollVerticallyBy是一样的代码

scrollBy是为了调用fill方法

fill里的方法主要做两件事,一个回收一个复用

layoutChunk复用代码

while ((layoutState.mInfinite || remainingSpace > 0) && layoutState.hasMore(state)) {

循环添加view到RecycleView当中去

向上添加还是向下添加是前面代码定义的

RecycleView的添加VIew方式依旧是addView的方式添加

当viewHolder获取失败才会继续获取

tryget方法是RecycleView的四级缓存

四级缓存

1mChangeScarp与mAttachedSecrap

2mCachedViews

3mViewCacheExtension

4RecycledViewPool-

ListView只有两级缓存

mChangeScarp与mAttachedSecrap是与屏幕分离和未分离 detch缓存在这边

mCachedViewsmove 缓存在这边

mViewCacheExtension 自定义的复用机制

RecycledViewPool默认缓存 缓存池

mChangedScrap是一个复用的集合

复用的对象是ViewHolder

ViewHolder可以理解为View的容器

当前方法是用过position去查找

1/2级缓存是在方法中存储下来的

来源于onLayout和onMeanue工作当中

接下来会在

进行复用

接下来会在进行复用(二级缓存)

上面的复用都是通过position来查找,而下一步,是通过id进行查找

同样的一级缓存

接下来的二级缓存

当一二级缓存均无法获得(holder==null)如果holder有值就不会继续

开始从我们自定义的缓存中获取参数

第四级就是pool

首先获取我们的pool

viewType

SparseArray key是viewType value是ScrapData

ScrapData里存放的是ViewHodler的集合

Pool是一个栈结构

如果四级缓存都没拿到就使用create

接下来将viewHolder存入池中

接下来是回收流程

先确定mCachedViews的大小

在cacheView是先进先出的数据结构,因为每次拿到的都是第0个

然后添加到了pool中

然后添加到集合当中,然后判断尺寸是否大于max

而大于一定数量就不会再添加到池了,就会不断create

首先先将

cacheView的第0个,第0个是最老的,将他移除,通过remove的方式获得添加进回收池pool,所谓的mScrap

顾名思义,废弃池

但是废弃池也是我们RecycleView的第四级缓存

onLayout的时候会将View添加到一二级缓存

而显示错乱也在这里得到了解释,因为我们在复用ViewHodler

解决ViewHodler的错乱可以让绑定不同的参数

ViewType对应的缓存pool默认是5个

但是如果有三个viewtype就有15个

5n+2的关系

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值