代码之家  ›  专栏  ›  技术社区  ›  Konrad Morawski

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

  •  2
  • Konrad Morawski  · 技术社区  · 7 年前

    我在探索 Paging 美国图书馆 Architecture Components 一套

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

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

    此解决方案具有某些优势,例如更好的可测试性,尽可能保持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 回复  |  直到 7 年前