Skip to content

QuickAdapterHelper

mumu edited this page May 30, 2023 · 8 revisions

QuickAdapterHelper

工具类,用于构造“加载更多”、头部尾部、组合Adapter等功能

此类的本质是使用 ConcatAdapter 进行组合,从而实现“向上加载”、“向下加载”、“头部”、“尾部”的功能。

通过此工具类包装以后,可以得到一个对外的adapter,用于设置给RecyclerView

前言:ConcatAdapter介绍

ConcatAdapter 是官方提供的类。我们之前常常遇到一种场景:即Adapter里有很多的ItemType,导致Adapter内部逻辑交织,内容庞大,对于数据的刷新,变得难以操作,一不小心就因为index的计算错误,而导致各种各样的问题,通常这样的代码难以维护。 之前的BRVAH为了解决这样的问题,提供了各种多类型Adapter,包括很多三方库也是这样做的,但是依然不能解决的问题就是:如何精准又安全稳定的刷新数据。

为此,官方推出了ConcatAdapter,此与系统版本无关,只需要升级你JetpackRecycleView版本即可。 ConcatAdapter 是一个Adapter的集合,你可以理解为List数组,通过一个ConcatAdapter把各种Adapter串起来。每个子Adapterindex都可以是从 0 开始,也就意味着,每个子Adapter只需要操作各自的数据,互不干扰。天然达到了代码隔离作用。

看如下示例图,例如:列表由三个子Adapter构成:

 ______________________________________
|                                      |
|             FirstAdapter             |
|                                      |
|                                      |
----------------------------------------
|                                      |
|                                      |
|            SecondAdapter             |
|                                      |
|                                      |
----------------------------------------
|                                      |
|                                      |
|             ThirdAdapter             |
|                                      |
|                                      |
 --------------------------------------

             ConcatAdapter

QuickAdapterHelper 基础

此类必须通过使用 Build 来构建,必须传递你的列表adapter,build时包含Api如下:

// 使用 Builder 创建 QuickAdapterHelper 对象,这里需要传入你的列表 mAdapter
val helper = QuickAdapterHelper.Builder(mAdapter)
    // 设置尾部"加载更多"
    .setTrailingLoadStateAdapter(……)
    // 设置首部“加载更多”
    .setLeadingLoadStateAdapter(……)
    // 设置 ConcatAdapter 的配置
    .setConfig(……)
    .build()


// 注意⚠️:RecyclerView 必须使用 helper 提供的 adapter
recyclerView.adapter = helper.adapter

QuickAdapterHelper 功能

QuickAdapterHelper内部已经有了你的列表mAdapter,据此为原点,提供以下功能:

// 在 mAdapter 前面,添加其他 adapter
fun addBeforeAdapter(adapter: BaseQuickAdapter<*, *>)

// 在 mAdapter 后面,添加其他 adapter
fun addAfterAdapter(adapter: BaseQuickAdapter<*, *>)

// 移除一个 adapter
fun removeAdapter(adapter: BaseQuickAdapter<*, *>)

// 清理 mAdapter 前面的所有 Adapter
fun clearBeforeAdapters()

// 清理 mAdapter 后面的所有 Adapter
fun clearAfterAdapters()