Отображение пустого состояния при использовании библиотеки Google Paging3

#android #kotlin #android-paging

#Android #kotlin #android-подкачка

Вопрос:

В настоящее время я впервые использую библиотеку Google Paging3. Я основываю свой код на их Codelab вhttps://codelabs.developers.google.com/codelabs/android-paging/#0.

Поток моего приложения соответствует следующим правилам:

  1. отображение пустого состояния
  2. пусть пользователи ищут что-то
  3. отображение результатов
  4. когда пользователь нажимает кнопку «Назад» на панели поиска -> снова отобразить пустое состояние

К сожалению, codelab не обрабатывает пустые состояния: ( Я использую следующий addoadstatelistener для обработки результатов поиска:

 adapter.addLoadStateListener { loadState ->
            // Only show the list if refresh succeeds.
            binding.userRecyclerView.isVisible = loadState.source.refresh is LoadState.NotLoading
            // Show loading spinner during initial load or refresh.
            binding.progressBar.isVisible = loadState.source.refresh is LoadState.Loading
            // Show the retry state if initial load or refresh fails.
            binding.errorMessage.isVisible = loadState.source.refresh is LoadState.Error
            if (binding.errorMessage.isVisible) {
                binding.errorMessage.text =
                    (loadState.source.refresh as LoadState.Error).error.toString()
            }
            binding.retryButton.isVisible = binding.errorMessage.isVisible

            // Toast on any error while loading more entries
            val errorState = loadState.source.append as? LoadState.Error
                ?: loadState.source.prepend as? LoadState.Error
                ?: loadState.append as? LoadState.Error
                ?: loadState.prepend as? LoadState.Error
            errorState?.let {
                Toast.makeText(
                    context,
                    resources.getString(R.string.error_loading),
                    Toast.LENGTH_LONG
                ).show()
            }
        }
  

Как я могу использовать addoadstatelistener для отображения пустого состояния? LoadState имеет только три возможных значения: не загружается, Загрузка и ошибка. Однако я не всегда хочу отображать RecyclerView. Это должно быть видно только при наличии результатов, И пользователь не нажал кнопку «Назад».

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

Заранее спасибо!

Ответ №1:

Вот пара API, которые могут оказаться полезными:

Вы можете использовать PagingData.empty() для создания пустого PagingData файла, который вы можете отправить для «очистки» предыдущего PagingData , пока не вызовете adapter.submitData снова. Это полезно, если вы хотите отображать пустое состояние между поисками или перед поиском. Вы также можете использовать PagingData.from(list) , если хотите показать некоторый статический контент.

Чтобы получить представленное количество элементов, вы можете использовать adapter.itemCount

Если вам нужно конкретно проверить, какие элементы загружаются после завершения обновления, вы можете использовать adapter.peek(index) или adapter.snapshot() , чтобы получить все элементы сразу (но это дороже).

Комментарии:

1. Должен ли я очистить PagingData в адаптере? Где я могу получить доступ к содержащимся в ней данным? (Я возвращаю PagingData в виде потока в моем текущем сетевом запросе)

2. Вы можете получить доступ только к представленным данным в PagingDataAdapter. PagingData — это просто тонкая оболочка вокруг внутреннего потока событий, поэтому она не хранит и не кэширует какие-либо данные. Однако loadStateFlow выполняется синхронно с обновлениями адаптера, поэтому, когда ОБНОВЛЕНИЕ не загружается, вы можете проверить состояние адаптера с помощью методов, которые я упомянул выше.

3. Имеет смысл: D Я попытался решить свою проблему, как вы описали. Работает как шарм! Спасибо 🙂