我的问题是指在使用 Paging 提供的构造时实现“加载更多”视图(微调器)。
我通常会手动实现无限滚动模式。这意味着我通常会向适配器提供一个“视图模型”列表(在架构组件意义上,它们不一定是视图模型,只是代表所有列表项的实体),包括一个可选附加的“加载更多”对象,然后适配器将呈现为“加载”视图。
这种解决方案具有一定的优势,例如更好的可测试性和保持 UI 层尽可能简单和被动,将适配器与任何业务逻辑解耦。
使用 Paging 似乎并不容易。从我所见,您应该将一个PagedList
实例流连接到该PagedListAdapter.submitList
方法,并且魔术会自行发生。
然后,为了添加一个微调器,您实际上会从视图模型中公开一个“网络状态”,将它单独传递给适配器,并让适配器动态地注入微调器。
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 库一样好?