Я использую Android Пейджинг для бесконечного списка
, но у меня есть проблема
- Мне нужно кэшировать свои данные в Room, получить их из API и отобразить в RecyclerView .
-> простейшее решение Dao, которое возвращает DataSource.Factory, он работает, но вот проблема, как получать данные на страницах из api, а не извлекать и кэшировать все данные сразу
-> Я пробовал BoundaryCallback, но, похоже, он предоставляет последний элемент и хочет загрузить больше элементов. Он также вызывается, только если я прокручиваю до конца списка, поэтому, если у меня есть кэшированные элементы в базе данных, он не обновляет sh их при прокрутке, а запрашивает больше данных, когда в списке больше нет данных -> здесь возможно, я мог бы написать собственный источник данных, который извлекает данные на страницах из комнаты, а затем граничная фабрика будет называться
-> поэтому я решил написать собственный источник данных и использовать PositionalDataSource a, который я только что смещал, ограничиваю пару, чтобы получить больше данных
У меня есть метод репозитория loadActivities (offset, limit) , который возвращает List<Activity>
из базы данных Room, затем выполняет запрос api и возвращает обновленные данные, сохраняя их в Room.
Итак, в моем DataSource я попытался использовать это для загрузки страниц, и вот проблема, которую я получаю 1) Кэшированные данные и вызов callback.onResult (data) 2) Обновленные данные и вызов callback.onResult (data) < - Проблема в том, что IllegalStateException onResult () не может быть вызван несколько раз
У меня обычно что-то вроде этого
GlobalScope.launch {
repo.loadActivitiesOf(settings.companyId, offset, limit)
.collect {
networkError.send(it.error)
when (it.status) {
Resource.Status.SUCCESS -> {
callback( it.data ?: listOf() )
isLoading.send(false)
cancel()
}
Resource.Status.LOADING -> {
it.data?.let { callback( it ) }
isLoading.send(true)
}
Resource.Status.ERROR -> {
isLoading.send(false)
cancel()
}
}
}
}
Могу ли я как-то аннулировать это, если появятся новые данные?
Другое решение, которое я пробовал, - это дождаться возврата данных с сервера, но тогда у меня есть задержка, и я хочу отобразить кэшированные данные сразу после 1-2 se c refre sh это с новым данные с сервера.