我在探索
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
}
我觉得它有点笨重,容易出错,也不是特别优雅。是否有更好的替代方案,或者这是否与分页库一样好?