Как сделать недействительным подмножество данных в PagedList или DataSource?

В библиотеке подкачки Android, как сделать недействительным подмножество набора данных в PagedList или DataSource? Я пишу PagedList или DataSource, потому что не знаю, по какому из них мне позвонить.

Например, я делаю приложение контроля качества под названием BufferOverflow.

У меня есть PageKeyedDataSource, который загружает данные по сети. Он поддерживает разбиение на страницы по индексу в API. В этом приложении у меня есть экран "Популярные вопросы" с "бесконечным" списком самых популярных вопросов. Конечно, главный вопрос периодически обновляется.

Как:

  1. Обновить набор данных на странице 1?
  2. Обновить набор данных на странице 10?

Я понимаю, что преимущество использования PagedList заключается в том, что он будет вычислять, какой элемент является новым / старым, с использованием DiffUtil. Но как мне сказать, что набор данных для определенных key или position изменился?

То, о чем я прошу, невозможно? Следует ли мне самостоятельно реализовать настраиваемое поведение подкачки?


Примечание.

  1. Я не хочу аннулировать все данные.

адаптер.getCurrentList (). getDataSource (). invalidate ();

Это сделает недействительными все данные в источнике данных. Хотя я просто хочу сделать некоторую часть данных недействительной.

  1. Я думаю, что API, который я ищу, похож на RecyclerView.Adapter's

list.adapter.notifyItemChanged (0);

Но, конечно, это не ответственность адаптера за обновление набора данных. Это либо классы PagedList, DataSource, либо дао ..


person aldok    schedule 09.02.2019    source источник
comment
"I don't want to invalidate all the data." - вы должны, другого пути нет - подробнее см. this и найдите Updating Paged Data раздел   -  person pskink    schedule 09.02.2019
comment
Почему бы не сделать данные недействительными и правильно реализовать _1 _ / _ 2_?   -  person EpicPandaForce    schedule 09.02.2019
comment
@EpicPandaForce, не могли бы вы объяснить, что вы имеете в виду под правильным внедрением loadBefore / loadAfter?   -  person aldok    schedule 09.02.2019
comment
так почему бы вам не аннулировать все данные?   -  person pskink    schedule 09.02.2019
comment
@pskink, потому что тогда это было бы неэффективно. Причина, по которой я использую разбиение на страницы, заключается в том, что я думал, что нам нужно сделать недействительными только небольшую часть данных, чтобы перезагрузить список (разница будет рассчитана с помощью DiffUtil). Например, в приложении Twitter нам не нужно перезагружать весь твит, а только аннулировать первый индекс твита (новые твиты).   -  person aldok    schedule 09.02.2019
comment
@pskink Ты прав. PagedList неизменен. Если я хотел обновить небольшую часть данных, мне нужно было реализовать несколько источников данных и получить информацию об обновлении из нового списка PagedList. Спасибо, что поделились ссылкой на документацию :)   -  person aldok    schedule 09.02.2019
comment
Тебе удалось? @Aldok   -  person milad salimi    schedule 14.06.2020


Ответы (1)


Единственный способ решить эту проблему - ввести слой сохранения с помощью Room. https://github.com/googlesamples/android-architecture-components/tree/master/PagingWithNetworkSample#paging-with-database-and-network

Согласно документам здесь: https://developer.android.com/reference/androidx/paging/DataSource#updating-paged-data

Если у вас есть более детализированные сигналы обновления, такие как сетевой API, сигнализирующий об обновлении одного элемента в списке, рекомендуется загружать данные из сети в память. Затем представьте эти данные в PagedList через DataSource, который является оболочкой для моментального снимка в памяти. Каждый раз, когда копия в памяти изменяется, можно сделать недействительным предыдущий источник данных и создать новый, обертывающий новое состояние моментального снимка.

https://developer.android.com/topic/libraries/architecture/paging/data#consider-content-updates

Создавая наблюдаемые объекты PagedList, подумайте о том, как работают обновления содержимого. Если вы загружаете данные непосредственно из базы данных Room, обновления автоматически передаются в пользовательский интерфейс вашего приложения.

person Badhrinath Canessane    schedule 08.06.2019