RecyclerView获取某个item的VIewHolder、View为空的问题

就一句话,这个Item是否可见,可见获取得到,不可见获取为空

1.RecyclerView的二级缓存机制

RecyclerView中,有两个缓存:ScrapRecycleScrap中文就是废料的意思,Recycle对应是回收的意思。这两个缓存有什么作用呢?首先Scrap缓存是指里面缓存的View是接下来需要用到的,即里面的绑定的数据无需更改,可以直接拿来用的,是一个轻量级的缓存集合;而Recycle的缓存的View为里面的数据需要重新绑定,即需要通过Adapter重新绑定数据。关于这两个缓存的使用场景,下一节详细介绍。

当我们去获取一个新的View时,RecyclerView首先去检查Scrap缓存是否有对应的positionView,如果有,则直接拿出来可以直接用,不用去重新绑定数据;如果没有,则从Recycle缓存中取,并且会回调AdapteronBindViewHolder方法(当然了,如果Recycle缓存为空,还会调用onCreateViewHolder方法),最后再将绑定好新数据的View返回。

(引用来自 https://blog.csdn.net/huachao1001/article/details/51594004#rd

 

2.关于LayoutManager与缓存机制的实现

LayoutManager负责管理RecyclerView各个itemVIew页面布局,其中就有实现RecyclerView 的itemView缓存机制的任务。

一开始加载RecyclerView时,LayoutManager会创建所有的itemView并且绑定数据,然后都放入scrap缓存池里,再判断当前界面需要显示哪些position的itemview,最后再从scrap缓存池里拿出相应的itemview。

比如LinearLayoutManager的 onLayoutChildren(PS:用于确定各个itemview的位置和显示)里就有这么一行代码,看名字也知道意思

detachAndScrapAttachedViews(recycler);

我们在滚动RecyclerView的时候,会在LayoutManager里不断的判断哪些item依旧显示,还是从显示状态需要变成隐藏状态,还是从隐藏状态变成显示状态。当一个itemView从显示状态变成隐藏会使其放入scrap缓存池里,至于从隐藏到显示状态的itemView则是从scrap取出。

如果你remove某个itemview,则是放入recycle缓存池里。

猜你喜欢

转载自blog.csdn.net/z979451341/article/details/79099201