Правильная обработка представления «loading more» при использовании библиотеки подкачки - PullRequest
0 голосов
/ 08 ноября 2018

Я изучаю библиотеку 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
}

Я нахожу это немного громоздким, подверженным ошибкам и не особенно элегантным.Есть ли лучшие альтернативы, или это так же хорошо, как это происходит с библиотекой подкачки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...