BaseRecyclerViewAdapterHelper源码解析

本篇主要从库的使用和设计思路并结合源码来讲解。

首先从简单的入手,大体介绍下库的使用和设计思路。

1、BRVAH库介绍

强大而灵活的RecyclerView Adapter——这是github首页的介绍。其实就是对RecyclerView原生Adapter的灵活封装,方便开发者使用。下面是整个项目库的简单架构图。

图一

BaseQuickAdapter实现了最基础的功能,封装了列表item的点击事件、动画等。

继承BaseMultiItemAdapter能够更方便的实现多类型布局。

BaseDifferAdapter使用Differ来管理数据,能够进行数据的局部刷新,通常用于实现大数据的列表、以及频繁的刷新列表的场景。

BaseSingleItemAdapter只有一个item的场景,通常用于实现列表的Header或者Footer部分。

以上部分在项目wiki部分均有详细的使用方法的介绍,就不做过多的赘述了。

2、BaseQuickAdapter源码分析

BaseQuickAdapter主要实现了RecyclerView.Adapter如下几个方法,其中onCreateViewHolderonBindViewHolder这两个方法是最基础的必须要重写的方法。

2.1、onCreateViewHolder

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

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

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

其中itemViewchild 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设置了固定idtag以及对应的值listener

onBindViewHolder()中因为没有viewType参数,是通过onCreateViewHolder()中设置的tag拿到对应的listener,然后调用listener.onBind()来绑定数据。

通过以上设置,将原本需要在onCreateViewHolder()onBindViewHolder()中做各种itemType的判断,换成了用不同的listener来代替,代码结构变得清晰了很多,也变得更易于理解和后期的维护。

4、BaseSingleItemAdapter源码分析

该类型的Adapter比较简单了,只有一个itemAdapter,通过setItem()方法来更新数据。一般作为列表的Header或者Footer部分。

5、BaseDifferAdapter源码分析

此类型的Adapter通过Differ来管理数据,一般用来做大数据列表。

6、QuickAdapterHelper源码分析

该类的本质是使用ContactAdapter来组合多个Adapter。具体使用方法wiki有详细的介绍。使用方式如下:

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

接下来分析当列表滑动到底部时是如何触发更新的。

一般我们自定义尾部Trailing时会继承TrailingLoadStateAdapter。以官方Demo默认实现的DefaultTrailingLoadStateAdapter为例,继承关系如下:

LoadStateAdapter实际上也是只有一个itemAdapter

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

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

最终会触发调用:

通过上面流程的分析我们就了解了,是在onViewAttachedToWindow()中触发了加载更多。

另外还有动画以及DragSwipe相关的就不详细分析了。

动画的原理其实跟上面的一样,也是在onViewAttachedToWindow()中触发执行各类Animation的执行,如ScaleInAnimationSlideInBottomAnimationSlideInLeftAnimation等。

滑动排序、滑动删除等核心是使用ItemTouchHelper来做的,QuickDragAndSwipe是对ItemTouchHelper的封装。

至此,BRVAH库的源码分析就结束了,相信通过本文能大概了解该库的全貌以及核心的原理。本文只是抛砖引玉,深刻的理解可以下载源码并阅读。

原创不易,转载请注明出处:https://www.longdw.com