7

我正在探索架构组件套件的分页库。

我的问题是指在使用 Paging 提供的构造时实现“加载更多”视图(微调器)。

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

这种解决方案具有一定的优势,例如更好的可测试性和保持 UI 层尽可能简单和被动,将适配器与任何业务逻辑解耦。

使用 Paging 似乎并不容易。从我所见,您应该将一个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
}

我觉得它有点麻烦,容易出错,而且不是特别优雅。有没有更好的选择,或者这与 Paging 库一样好?

4

0 回答 0