Правильный способ вызова функции приостановки в PageKeyedDataSource - PullRequest
0 голосов
/ 01 мая 2020

У меня проблемы с проблемой. Поэтому я в основном реализую нумерованный список с данными, передаваемыми по сети.

Я использую следующее:

  1. Модификация с приостановкой

  2. MVVM с оперативными данными

  3. PageKeyedDataSource, DataSource.Factory и PagedListAdapter

Прямо сейчас для выполнения функции приостановки я передаю область сопрограммы (область видимости модели) для конструктора источника данных.

Все работает нормально, нумерация страниц работает, НО есть небольшая проблема, submitList () , который является методом адаптера обновление данных вызывается до того, как текущие данные будут фактически обновлены, поэтому их размер равен 0, поэтому DiffUtil.ItemCallback не вызывается для анимации списка. Список обновляется, но без анимации.

Думаю, будет проще, если я покажу вам 2 фрагмента кода в PageKeyedDataSource.loadInitial с упрощенным журналом:

С сопрограмма:


// the viewModel scope
scope.launch(getJobErrorHandler()) {
    networkState.postValue(NetworkState.Loading)
    Log.d(LOG_TAG, "Loading data")
    val result = withContext(withContext(Dispatchers.IO) {
        // retrofit suspend fun
        service.getSearchUsers(query, ApiConstants.DEFAULT_SEARCH_LIMIT, newOffset) 
    }
    Log.d(LOG_TAG, "Finished loading")
    callback.onResult(result.users, result.next)
    networkState.postValue(NetworkState.SUCCESS)
}

во фрагменте


viewModel.users.observe(this@SearchFragment, Observer {
    adapter.submitList(it)
    Log.d(LOG_TAG, "submit list with count ${it.size}")
})

журнал:

D/MMF_APP: Loading data
D/MMF_APP: submitList() with count 0
D/MMF_APP: Finished loading

без сопрограммы:


networkState.postValue(NetworkState.Loading)
Log.d(LOG_TAG, "Loading data")

// mock method, non suspend
service.mockGetSearchUsers(query, ApiConstants.DEFAULT_SEARCH_LIMIT, newOffset) 

Log.d(LOG_TAG, "Finished loading")
callback.onResult(result.users, result.next)
networkState.postValue(NetworkState.SUCCESS)

во фрагменте


viewModel.users.observe(this@SearchFragment, Observer {
    adapter.submitList(it)
    Log.d(LOG_TAG, "submit list with count ${it.size}")
})

Журнал:

D/MMF_APP: Loading data
D/MMF_APP: Finished loading
D/MMF_APP: submitList() with count 5

Обратите внимание, что в обоих случаях нумерация страниц работает хорошо, единственное отличие состоит в том, что при использовании сопрограмм вначале список размера 0 устанавливается для адаптера и как я уже говорил, DiffUtil.ItemCallback не вызывается.

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