关于Graywater的系列文章
- RecyclerView的超强辅助Graywater——理论篇
- RecyclerView的超强辅助Graywater——基础实操篇
- RecyclerView的超强辅助Graywater——点击事件
- RecyclerView的超强辅助Graywater——综合实操篇
Graywater是一个什么东西呢?它是由Tumblr开源的一个代替RecyclerView.Adapter的类库。Graywater将RecyclerView.Adapter拆解并重新设计封装后,能使复杂多重结构的RecyclerView在使用时如丝般顺滑。
我将从四个问题来带大家了解什么是Graywater。
-
问题一:Graywater是什么
-
问题二:Graywater特点是什么?
-
问题三:Graywater原理是什么?
-
问题四:与原有的RecyclerView.Adapter相比,Graywater重写了哪些核心方法?
一个问题一个问题的来看。
第一个问题:Graywater是什么?
Graywater是一个由Tumblr开发的第三方类库,是RecyclerView的一个适配器(Adapter)。因为Graywater的多模块设计方式,所以在继承GraywaterAdapter时,需要同时实现Graywater中各个模块的相关类,来实现Graywater的特点。它最大的好处是能高效的处理复杂的列表,使复杂的列表使用起来如丝般顺滑。
看一下官方Demo的GIF图:
下面是我写的一个Demo的GIF图,我写的这个Demo不是很复杂,只是起到一个抛砖引玉的结果,Graywater还能实现更复杂的效果。
第二个问题:Graywater有什么特点?
通常我们在使用RecyclerView.Adapter时,是将数据集合(model)和对应的ViewHolder相匹配,这种结构用在存在大量样式复杂的View时候,很容易变得卡顿。
下图是一个普通的列表,为了提高体验,超过屏幕部分的部分其实是可以回收的:
为了将超过屏幕的部分给回收,Tumblr采用了以下2个设计来提高性能并减少内存。
-
Viewholders能够被相同或者不同类型的models所共享,上图中item#1和item#2的body viewholder就可以被共享。
-
一个Model能拥有不同的Viewholders,一个item对应一个Model,所以一个item也就能拥有无数个body viewholders。
这样做的结果是能使用最少数量的ViewHolders来最大化内存的使用率,同时还能减少内存的使用。
第三个问题:Graywater原理是什么?
在讨论这个问题前,我们先眼熟一下这张图,这张图概括了Graywater的设计。
这张图里面涉及到了5个类:
- Model
- ViewHolder
- ViewHolderCreator
- Binder
- ItemBinder
Model和ViewHolder是在使用RecyclerView时本来就会用到的,但是这2个类,因为Graywater的设计原因,会跟在RecyclerView.Adapter使用时有一些区别。在下一篇基础实操篇中可以看到。同时为了实现问题2中的2个特点,Tumblr在这两者间添加了Binder类。来把model(T)数据绑定到 viewholder (VH)视图上。
+-------+ +--------+ +------------+
| Model | --> | Binder | -->