Android进阶

RecyclerView回收复用机制浅析

2017-05-09  本文已影响3811人  ponytty

RecyclerView回收复用机制浅析

RecyclerView 基本上已经成为了开发中常用的一个组件,通过其提供的强大能力,能实现各种需要的列表类效果。灵活的同时,要用好却也不容易,为了高效实现需求,避免掉到各种不明所以的坑里面,这里有必要对其回收复用机制做一个探究。

本文将带着下面这几个方面的问题来探究。tips:结合源码食用更佳。

回收复用机制到底回收复用的是啥

回收复用的单元是Viewholder,我们记得,在使用 ListView 的时候,也用到了 ViewHolder,这两者其实是有区别的。

谁负责回收复用机制

这里也首先从源码入手,结合源码的注释进行学习。

通过源码发现,Recycler 是负责管理废弃的(scrapped)分离的(detached) item进行的复用的。这里解释一下, 所谓废弃的 view,指的是 view 仍然
附加在父 RecyclerView 上, 但是被标记为要删除或者重新绑定或复用的。

Recycler回收复用的能力,可以通过观察其成员变量来理解:

abstract public View getViewForPositionAndType(Recycler recycler, int position, int type)

这个抽象方法, 该方法为开发者自定义复用机制提供接口,由开发者自行决定 ViewHolder 缓存的实现,并根据 viewtype 和 adapter position 返回 view 给 RecyclerView。

回收复用的机制是怎样的

要了解复用的机制是什么, 着重学习 Recycler 的 getViewForPosition(int position, boolean dryRun) 的方法。下图是其流程图。

st=>start: Start
op1=>operation: 从 changedScrap 中寻找
op2=>operation: 从 attachedScrap 中寻找
op3=>operation: 从 mViewCacheExtension 中寻找
op4=>operation: 从 RecyclerViewPool 中寻找
op5=>operation: 调用 creatViewholder

cond1=>condition: 没找到
cond2=>condition: 没找到
cond3=>condition: 没找到
cond4=>condition: 没找到
o1=>inputoutput: 状态处理
e=>end: End

st->op1->cond1
cond1(yes)->op2->cond2
cond2(yes)->op3->cond3
cond3(yes)->op4->cond4
cond4(yes)->op5->o1->e
cond1(no)->o1
cond2(no)->o1
cond3(no)->o1
cond4(no)->o1

基于这样的回收复用机制, 使用的时候要注意哪些事情

上一篇 下一篇

猜你喜欢

热点阅读