本篇主要从库的使用和设计思路并结合源码来讲解。
首先从简单的入手,大体介绍下库的使用和设计思路。
1、BRVAH库介绍
强大而灵活的RecyclerView Adapter——这是github首页的介绍。其实就是对RecyclerView原生Adapter的灵活封装,方便开发者使用。下面是整个项目库的简单架构图。

BaseQuickAdapter
实现了最基础的功能,封装了列表item的点击事件、动画等。
继承BaseMultiItemAdapter
能够更方便的实现多类型布局。
BaseDifferAdapter
使用Differ
来管理数据,能够进行数据的局部刷新,通常用于实现大数据的列表、以及频繁的刷新列表的场景。
BaseSingleItemAdapter
只有一个item的场景,通常用于实现列表的Header或者Footer部分。
以上部分在项目wiki部分均有详细的使用方法的介绍,就不做过多的赘述了。
2、BaseQuickAdapter源码分析
BaseQuickAdapter
主要实现了RecyclerView.Adapter
如下几个方法,其中onCreateViewHolder
和onBindViewHolder
这两个方法是最基础的必须要重写的方法。

2.1、onCreateViewHolder
这个方法是必须要实现的,用于创建RecyclerView.ViewHolder
。首先针对viewType=EMPTY_VIEW
类型做了特殊处理,常见的比如没获取到数据或数据请求异常时要显示一些提示页面,可以通过设置BaseQuickAdapter#isStateViewEnable
和BaseQuickAdapter#stateView
来启用状态布局和设置自定义的状态布局。

其次暴露了下面方法让继承BaseQuickAdapter
的子类重写

另外还封装了itemView
的点击和长按事件,以及itemView
中child
view
的点击和长按事件。


其中itemView
中child view
的点击事件的处理方式,将child view
‘s id
和监听器一一映射存入SparseArray
中,我觉得设计的比较巧妙。

2.2、onBindViewHolder
这个方法也是必须要实现的,用于绑定数据。首先判断如果使用的是StateLayoutVH
(就是上面onCreateViewHolder
中针对viewType=EMPTY_VIEW
类型返回的ViewHolder
)就调用changeStateView
处理,主要就是将自定义的view
加入进来,比较简单,由于篇幅有限就不展示源码了。

然后暴露了如下方法给子类重写:

3、BaseMultiItemAdapter源码分析
该库最吸引我的地方就是对多类型的封装,v4版本相较于之前的版本简化了很多,使用起来来非常方便。下图节选自官方wiki:

BaseMultiItemAdapter
继承自BaseQuickAdapter
,主要重写了onCreateViewHolder()
、onBindViewHolder()
、getItemViewType()
3个方法。
其中addItemType()
方法可以添加我们需要的各种类型。


onMultiItemAdapter
接口暴露了一些常用的方法。

接下来就是onCreateViewHolder(
)和onBindViewHolder()
的实现。
其中onCreateViewHolder()
通过viewType
参数从typeViewHolders
队列中拿到对应的listener
,然后调用listener.onCreate()
来创建ViewHolder
,并且为itemView
设置了固定id
的tag
以及对应的值listener
。
onBindViewHolder()
中因为没有viewType
参数,是通过onCreateViewHolder()
中设置的tag
拿到对应的listener
,然后调用listener.onBind()
来绑定数据。


通过以上设置,将原本需要在onCreateViewHolder()
和onBindViewHolder()
中做各种itemType
的判断,换成了用不同的listener
来代替,代码结构变得清晰了很多,也变得更易于理解和后期的维护。
4、BaseSingleItemAdapter源码分析
该类型的Adapter
比较简单了,只有一个item
的Adapter
,通过setItem()
方法来更新数据。一般作为列表的Header
或者Footer
部分。

5、BaseDifferAdapter源码分析
此类型的Adapter
通过Differ
来管理数据,一般用来做大数据列表。
6、QuickAdapterHelper源码分析
该类的本质是使用ContactAdapter
来组合多个Adapter
。具体使用方法wiki有详细的介绍。使用方式如下:

通过建造者模式构造尾部(Trailing
)、头部(Leading
),以及其他的配置。然后通过build()
的方法构造QuickAdapterHelper
对象,接着在init
代码块中将Trailing
、Leading
部分加入到ContactAdapter
中。

接下来分析当列表滑动到底部时是如何触发更新的。
一般我们自定义尾部Trailing
时会继承TrailingLoadStateAdapter
。以官方Demo默认实现的DefaultTrailingLoadStateAdapter
为例,继承关系如下:



LoadStateAdapter
实际上也是只有一个item
的Adapter
:

TrailingLoadStateAdapter
重写了displayLoadStateAsItem()
方法,用来控制Trailing
是显示还是隐藏:

当列表滑动到底部,这时候TrailingLoadStateAdapter
中的onViewAttachedToWindow()
会触发调用:

最终会触发调用:

通过上面流程的分析我们就了解了,是在onViewAttachedToWindow()
中触发了加载更多。
另外还有动画以及DragSwipe
相关的就不详细分析了。
动画的原理其实跟上面的一样,也是在onViewAttachedToWindow()
中触发执行各类Animation
的执行,如ScaleInAnimation
、SlideInBottomAnimation
、SlideInLeftAnimation
等。
滑动排序、滑动删除等核心是使用ItemTouchHelper
来做的,QuickDragAndSwipe
是对ItemTouchHelper
的封装。
至此,BRVAH库的源码分析就结束了,相信通过本文能大概了解该库的全貌以及核心的原理。本文只是抛砖引玉,深刻的理解可以下载源码并阅读。
原创不易,转载请注明出处:https://www.longdw.com