Размер выгружаемого списка 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().

Другие вопросы по тегам