使用分页库时正确处理“正在加载更多”视图

时间:2018-11-08 13:36:08

标签: android recycler-adapter android-paging android-architecture-components

我正在探索Paging套件的Architecture Components库。

我的问题是在使用Paging提供的结构时实现“加载更多”视图(旋转器)。

我通常会手动实现无限滚动模式。这意味着我通常会向适配器提供“视图模型”列表(在建筑组件意义上不一定是视图模型,只是代表所有列表项的实体),包括一个可选附加的“加载更多”对象,适配器随后将显示为“正在加载”视图。

此解决方案具有某些优势,例如更好的可测试性以及使UI层尽可能简单和被动,将适配器与任何业务逻辑分离。

使用分页似乎并不容易。从我所看到的,您应该将PagedList实例流连接到PagedListAdapter.submitList方法,魔术将自己发生。

然后,为了添加一个微调器,您实际上要从视图模型中公开“网络状态”,将其分别传递给适配器,然后让适配器动态注入微调器。

在示例代码-https://github.com/googlesamples/android-architecture-components/blob/master/PagingWithNetworkSample/app/src/main/java/com/android/example/paging/pagingwithnetwork/reddit/ui/PostsAdapter.kt

中就是这样
class PostsAdapter /* snip */ {
    private var networkState: NetworkState? = null

    // snip

    private fun hasExtraRow() = networkState != null && networkState != NetworkState.LOADED

    // snip

    override fun getItemCount(): Int {
        return super.getItemCount() + if (hasExtraRow()) 1 else 0
    }

    fun setNetworkState(newNetworkState: NetworkState?) {
        val previousState = this.networkState
        val hadExtraRow = hasExtraRow()
        this.networkState = newNetworkState
        val hasExtraRow = hasExtraRow()
        if (hadExtraRow != hasExtraRow) {
            if (hadExtraRow) {
                notifyItemRemoved(super.getItemCount())
            } else {
                notifyItemInserted(super.getItemCount())
            }
        } else if (hasExtraRow && previousState != newNetworkState) {
            notifyItemChanged(itemCount - 1)
        }
    }

    // snip
}

我觉得它有点笨重,易错,而且不是特别优雅。有没有更好的选择,或者这与分页库一样好?

0 个答案:

没有答案