看了又看,任然对其一知半解。用了又用,发现其真的太美。RecyclerView的设计和书写实在是太惊艳了,日常又使用的相当频繁。虽然之前就看过其他的源码分析,故打算花点时间来亲子动画,对其来个了解,希望能向好的框架学习,写出这样优秀的代码。
既然是开始,当然是先从RecyclerView本身开始。
1.首先,AdapterDataObserver是一个抽象类。
2.后者是前者的一个内部实现类
来看他的具体方法。 里面还有判断是不是每次都是增量式完成layout的。
其中的bucket类在recycylerView中很常见,进行位运算的类?!
其本身是一个链表的结构。
如果一个对象有大量的是与非的状态需要表示,通常我们会使用BitMask 技术来节省内存,在 >Java 中,一个 byte 类型,有 8 位(bit),可以表达 8 个不同的状态,而 int 类型,则有 32 >位,可以表达 32 种状态。再比如Long类型,有64位,则可以表达64中状态。一般情况下使用一个>Long已经足够我们使用了。但如果有不设上限的状态需要我们表示呢?在ChildHelper里有一个静>>态内部类Bucket
可以看到,Bucket是一个链表结构,当index大于64的时候,它便会去下一个Bucket去寻找,所以,Bucket可以不设上限的表示状态。
内部类CallBack其实就是RecyclerView来实现其方法
也是一个内部类,是管理回收(scrapped)或者分离(detached)的内部管理类。 有layoutmanager来控制recycler中获得对应的view
dirty view需要重绘,而clean view不需要重绘和布局,直接由layoutmanager而使用
其中保存这 attached viewholder 和 changed viewholder
mUnmodifiableAttachedScrap 发现有一个集合。是有attached viewholder复制而来的不可重绘的副本。(通过java Collections.unmodifiableList()
)
[参考链接-Collections方法说明][1]
阅读参考链接,得知,这是一种通用的重构中使用的手法。
在《重构——改善既有代码的设计》一书中,有一种重构手法叫Encapsulate Collection >,(封装集合) 使用这种方法重构的意义:就好比我们网上购物一样,你可以往购物车添加自己想买的东西,但是>商户不能在不通知顾客(我们)的情况下,就任意的添加商品,并修改商品的价格等,入口只能是>一个,也就是在顾客手中。比喻可能不是很恰当,反正意思大概就是这样。
这个方法还是挺有意思的。将自己所包含的集合封装起来提供给其他的使用者。避免使用的时候发生改变。
RecycledViewPool lets you share Views between multiple RecyclerViews. 可以在不同的recyclerView中使用相同的pool。也可以让其自己创建。
这里文章里面对缓存机制的描述相当的透彻。
这里所的三级缓存还未理解到完整的结构。等到后面来完整的梳理。 以ViewType作为key来分类存放ViewHolder,每类ViewType都有单独容量限制,可以通过setMaxRecycledViews来为每种ViewType指定不同的容量限制。
ps:这里也是之前没理解的每一个viewholder加入时,会被执行 resetInternal方法。
既然有了viewholder缓存的pool类,为什么又有一个viewCacheExtension类呢?它是做什么的呢?
java getViewForPosition
时。如果没有合适的view Recycler会提供缓存的view来作为第一级的缓存。如果找不到合适的veiw,它会滴啊用 getViewForPositionAndType 在检查RecycledViewPool之前。也就是说。ViewCacheExtension 是介于一级缓存和RecyclerViewPool的缓存之间。 其只提供了一个方法。getViewForPosition来提供缓存的类。
这样的三级缓存就呼之欲出。但是三级缓存有什么好处呢?通常不是一级缓存就能解决问题了吗?