笔记(五)——RecycleView相关

——》个人平时笔记,看到的同学欢迎指正错误,文中多处摘录于各大博主精华、书籍

1、RecycleView复用原理:

(基于场景解析RecycleViewHolder复用机制)、(让你彻底掌握RecyclerView的缓存机制)

回收的逻辑比较简单:由 LayoutManager 来遍历移出屏幕的卡位,然后对每个卡位进行回收操作,回收时,都是把 ViewHolder 放在

mCachedViews 里面,如果 mCachedViews 满了,那就在 mCachedViews 里拿一个 ViewHolder 扔到

ViewPool 缓存里,然后 mCachedViews 就可以空出位置来放新回收的 ViewHolder 了。

RecyclerView 滑动场景下的回收复用涉及到的结构体两个:

mCachedViews 和 RecyclerViewPool

mCachedViews优先级高于 RecyclerViewPool,回收时,最新的 ViewHolder 都是往 mCachedViews

里放,如果它满了,那就移出一个扔到 ViewPool 里好空出位置来缓存最新的 ViewHolder。复用时,也是先到 mCachedViews

里找 ViewHolder,但需要各种匹配条件,概括一下就是只有原来位置的卡位可以复用存在mCachedViews 里的

ViewHolder,如果 mCachedViews 里没有,那么才去 ViewPool 里找。在 ViewPool 里的 ViewHolder

都是跟全新的 ViewHolder 一样,只要 type 一样,有找到,就可以拿出来复用,重新绑定下数据即可。

>1.

1.png
1.png

>2.mCachedViews与ViewPool区别

mCachedViews回收ViewHolder:重新回到可视区是不用重新绑定数据,从mCachedViews复用直接显示

ViewPool复用ViewHolder:复用需要重新绑定数据,回调onBindViewHolder()

2.png
2.png

>3. 如果mCachedViews——>ViewPool 中都没有找到 ViewHolder 来使用的话,那就调用 Adapter 的 onCreateViewHolder 来创建一个新的 ViewHolde

3.png
3.png

2、对于RecyclerView来说,强制实现ViewHolder的其中一个原因就是避免多次进行findViewById()的处理,另一个原因就是因为ItemView和ViewHolder的关系是一对一,也就是说一个ViewHolder对应一个ItemView。这个ViewHolder当中持有对应的ItemView的所有信息,比如说:position;view;width等等,拿到了ViewHolder基本就拿到了ItemView的所有信息,而ViewHolder使用起来相比itemView更加方便。RecyclerView缓存机制缓存的就是ViewHolder(ListView缓存的是ItemView),这也是为什么RecyclerView为什么强制我们实现ViewHolder的原因。

你可能感兴趣的:(笔记(五)——RecycleView相关)