Обнаружение пустого результата PagedList в Android

Я использую библиотеку Paging из Android Jetpack, чтобы иметь постраничную загрузку в мой RecyclerView. Теперь мне нужна простая вещь - получить в моем интерфейсе сигнал о том, что данных нет, а список пуст, чтобы я мог показать сообщение типа «нет элементов».

Проблема в том, что я использую PositionalDataSource без заполнителей, так как я не знаю, насколько большим будет список. Другая проблема заключается в том, что я могу брать только загруженные элементы из PagedList, поэтому я не знаю, загружаются ли в данный момент другие данные из моего DataSource.

Итак, вопрос в том, выдает ли PagedList или DataSource сигнал типа «я закончил загрузку»? Это событие четко определено в библиотеке, поскольку оно прекратит загрузку, как только получит меньше данных, чем запрошено, как упоминалось здесь: Возвращаемые данные должны быть этого размера, если только они не находятся в конце списка. Вопрос в том, могу ли я каким-то образом сообщить мне об этом событии?

На данный момент я вижу следующее решение. Я реализовал свой DataSource.Factory так же, как в Руководстве по Android, показанном в эта страница: выдача моего DataSource как LiveData на заводе. Кроме того, я уже представил объект LiveData из DataSource под названием isLoading, я использую его в пользовательском интерфейсе, чтобы показывать индикатор выполнения каждый раз, когда DataSource что-то загружает. Я подумываю добавить еще один LiveData с именем emptyResults, а затем я могу соединить их вместе в моем пользовательском интерфейсе, чтобы показывать сообщение «нет элементов», когда emptyResults && !isLoading.

Интересно, есть ли лучший способ сделать это.




Ответы (1)


Это решение сработало для меня:

Добавьте наблюдателя адаптера:

adapter?.registerAdapterDataObserver(adapterObserver)

Определить, пуст ли список и вставлено 0 элементов

private val adapterObserver = object : RecyclerView.AdapterDataObserver() {
    override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {

        val count = adapter?.itemCount
        if (itemCount == 0 && count == 0) {
            // List is empty
        } else {
            // List is not empty
        }
    }
}
person svprdga    schedule 11.12.2020