Я изучаю библиотеку Paging из Компоненты архитектуры Suite.
Мой вопрос касается реализации представления «загрузить больше» (счетчик) при использованииконструкции, предоставляемые Paging.
Я бы обычно реализовывал бесконечный шаблон прокрутки вручную.Это означает, что я обычно передаю адаптеру список «viewmodels» (которые не обязательно являются viewmodels в смысле компонентов архитектуры, просто сущности, представляющие все элементы списка), включая опционально добавленный объект «load more», который адаптер затемПредставлять в виде «загрузки».
Это решение обладает определенными преимуществами, такими как лучшая тестируемость и сохранение как можно более простого и пассивного уровня пользовательского интерфейса, отделяющего адаптер от любой бизнес-логики.
С пейджингом не все так просто.Из того, что я видел, вы должны подключить поток 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
}
Я нахожу это немного громоздким, подверженным ошибкам и не особенно элегантным.Есть ли лучшие альтернативы, или это так же хорошо, как это происходит с библиотекой подкачки?