Не очищайте RecyclerView при аннулировании PagedList

Я использую библиотеку Paging из Android Jetpack, чтобы иметь постраничную загрузку в мой RecyclerView. Я загружаюсь напрямую из сети, поэтому у меня нет промежуточного кеша или базы данных в памяти. Когда что-то меняется, я вызываю invalidate() на DataSource (в моем случае PositionalDataSource), чтобы список обновился.

Мне нужна очень простая вещь - как только я вызываю invalidate(), представление ресайклера полностью очищается и показывает пустые данные. Мне нужно представление ресайклера, чтобы сохранить старые данные и нормально обновляться после поступления новых. В большинстве случаев обновление может быть очень маленьким, например, изменение цвета кнопки в нескольких строках, это выглядит некрасиво, когда RecyclerView показывает пустой контент на пару секунд, пока я загружаю данные из бэкэнда.

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


comment
Если вы загружаете напрямую из сети, то почему это PositionalDataSource, а не источник данных ItemKeyed или PageKeyed?   -  person EpicPandaForce    schedule 17.04.2020
comment
это api серверной части, в запросе есть параметры для начального индекса и количества   -  person frangulyan    schedule 18.04.2020
comment
Я считаю, что LiveData<PagedList<T>> должен иметь возможность удерживать предыдущее значение, если оно не будет перезаписано новым из DataSource. Я предполагаю, что реальный вопрос заключается в том, почему вы получаете новый PagedList, просто делая недействительным, но еще не имея данных. Если это принудительно, может быть, пустой ответ можно проигнорировать ...?   -  person EpicPandaForce    schedule 18.04.2020
comment
Что ж, единственный способ запустить загрузку данных - сделать источник данных недействительным. Но всякий раз, когда я это делаю, вид ресайклера очищает пользовательский интерфейс. В PagedList есть detach функция, которая позволяет сохранить старое состояние представления ресайклера, как только я обнаруживаю, что мне нужно перезагрузить мои объекты. Однако после отсоединения ничего не произойдет, поскольку внутренние вызовы запускаются PagedList автоматически.   -  person frangulyan    schedule 19.04.2020
comment
Я думаю, что существует концептуальная проблема, поэтому Android очищает пользовательский интерфейс после аннулирования. Представьте, что я загрузил 20 объектов и через некоторое время понял, что объект номер 5 нужно снова получить из бэкэнда. Я бы сделал недействительным источник данных, и представление Recycler начало бы получать объекты из бэкэнда, но сохранило бы старый пользовательский интерфейс, как я хочу. Если выборка занимает слишком много времени - я мог бы прокручивать вверх и вниз и все испортить, представление ресайклера нужно будет получить снова, в зависимости от текущего местоположения прокрутки, поскольку загрузка элементов зависит от контекста пользовательского интерфейса. Единственный способ - иметь 1 источник правды - локальный кеш.   -  person frangulyan    schedule 19.04.2020


Ответы (1)


вызов notifyDataSetChanged вместо invalidate может помочь как простое решение.

person ygngy    schedule 15.04.2020
comment
Но это не приведет к обновлению данных на моем сервере. Я хочу, чтобы библиотека подкачки по-прежнему контролировала загрузку данных. Представьте, что я прокручивал до позиции 100-120, а затем происходит что-то, что потенциально может изменить данные. Вызов invalidate вызовет сетевой вызов моей серверной части для извлечения элементов 100–120, а вызов notifyDataSetChanged просто сигнализирует представлению ресайклера о необходимости перерисовки элементов. Однако эти элементы еще не были изменены, поскольку ничто не запускало новую внутреннюю выборку. - person frangulyan; 17.04.2020