В настоящее время я собираюсь включить в свое приложение библиотеку Paging Architecture (версия 2.1.0-beta01
на момент написания). Один из компонентов - это список, который позволяет пользователю удалять из него отдельные элементы. Этот список предназначен только для сети, и локальное кеширование с помощью Room не имеет смысла.
PagedList
неизменен и не поддерживает модификацию. Я читал, что иметь копию списка, который затем был изменен и возвращен в качестве нового, - это лучший вариант. В документации указано то же самое:
Если у вас есть более детализированные сигналы обновления, такие как сетевой API, сигнализирующий об обновлении одного элемента в списке, рекомендуется загружать данные из сети в память. Затем представьте эти данные в PagedList через DataSource, который является оболочкой для моментального снимка в памяти. Каждый раз, когда копия в памяти изменяется, можно сделать недействительным предыдущий источник данных и создать новый, обертывающий новое состояние моментального снимка.
В настоящее время у меня есть основная рекомендуемая реализация, чтобы показать простой список. Мой DataSource
выглядит так:
class MyDataSource<SomeItem> : PageKeyedDataSource<Int, SomeItem>() {
override fun loadInitial(params: LoadInitialParams<Int>, callback: LoadInitialCallback<Int, SomeItem>) {
// Simple load from API and notification of `callback`.
}
override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, SomeItem>) {
// Simple load from API and notification of `callback`.
}
override fun loadBefore(params: LoadParams<Int>, callback: LoadCallback<Int, SomeItem>) {
// Simple load from API and notification of `callback`.
}
}
Как будет выглядеть конкретная реализация кеша в памяти (без помещения и без признания недействительным всего набора данных), как указано в документации?
submitList
вызывается только один раз, и вся загрузка страницы выполняется внутри классаPagedList
. Таким образом, экземплярpagedList
здесь всегда содержит последние обновления списка, и мы используемPagedList.Callback
, чтобы знать, когда обновлятьdataSet
. Мы хотим, чтобыdataSet
отражалpagedList
, поэтому мы очищаем его и добавляем все изpagedList
. 29.10.2019submitList
в покое и вместо этого изменитьdataSet
.submitList
следует звонить только один раз. 27.02.2020dataSet
, как в примере выше. 02.03.2020override fun getItemCount(): Int { return dataSet.size }
26.05.2020