Размер выгружаемого списка LiveData всегда равен 0
Я реализовал пейджинг с помощью библиотеки подкачки Android. ViewModel возвращает LiveData<PagedList<MyObject>>
и я наблюдаю, что во фрагменте, где я установил адаптер, все работает хорошо, за исключением того, что когда я хочу проверить, размер списка всегда равен 0.
viewModel.getSearchResults().observe(this, mList -> {
adapter.submitList(mList);
Log.e("Count", String.valueOf(mList.size()));
});
Где mList является PagedList<MyObject>
2 ответа
Если вы посмотрите на Загрузка данных из PagedList
В документации вы заметите следующее:
Если вы используете
LivePagedListBuilder
чтобы получитьLiveData<PagedList>
, он инициализирует PagedLists в фоновом потоке для вас.
Кроме того, Mutable и Snapshots заявляют следующее:
PagedList является изменяемым во время загрузки или готов к загрузке из своего источника данных. При успешной загрузке изменяемый PagedList будет обновляться через Runnables в главном потоке. Вы можете прослушать эти обновления с
PagedList.Callback
, (Обратите внимание, чтоPagedListAdapter
прослушает их, чтобы сообщить RecyclerView об обновлениях / изменениях).
Если вы хотите слушать события onInserted
, onChanged
или же onRemoved
Вы можете сделать следующее:
viewModel.observableData.observe(viewLifecycleOwner, Observer { pagedList ->
adapter.submitList(pagedList)
pagedList.addWeakCallback(null, object: PagedList.Callback() {
override fun onChanged(position: Int, count: Int) {}
override fun onInserted(position: Int, count: Int) {
println("count: $count")
}
override fun onRemoved(position: Int, count: Int) {}
})
})
Если вы используете Rxjava3, RxJava3CallAdapterFactory.create() по умолчанию не является синхронным. Вам нужно использовать RxJava3CallAdapterFactory.createSynchronous().