我正在探索Paging套件的Architecture Components库。
我的问题是在使用Paging提供的结构时实现“加载更多”视图(旋转器)。
我通常会手动实现无限滚动模式。这意味着我通常会向适配器提供“视图模型”列表(在建筑组件意义上不一定是视图模型,只是代表所有列表项的实体),包括一个可选附加的“加载更多”对象,适配器随后将显示为“正在加载”视图。
此解决方案具有某些优势,例如更好的可测试性以及使UI层尽可能简单和被动,将适配器与任何业务逻辑分离。
使用分页似乎并不容易。从我所看到的,您应该将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
}
我觉得它有点笨重,易错,而且不是特别优雅。有没有更好的选择,或者这与分页库一样好?