У меня есть список сообщений, которые я получаю с помощью модернизации. Я использую библиотеку Android-пейджинга для получения 20 сообщений за раз.
Допустим, я второй раз открываю приложение. У меня уже есть 2 сообщения в базе данных, одно из которых удалено с сервера.
Как только я начинаю деятельность, я запрашиваю новые данные, используя BoundaryCallback. Прежде чем я получу новые данные, я удаляю данные, которые находятся в базе данных, которая вызывает проблему. Поскольку я использую обратный вызов границы, пустые данные показываются пользователю в виде изображения «Нет записей», а затем отображаются новые данные.
Я пытаюсь избежать обновления, которое показывает представление без записей.
Это действительно раздражает, в прошлом году я скачал образцы компонентов архитектуры GitHub из Google без подкачки страниц, и они попытались избежать этой проблемы в примере приложения, а не решить ее. Короче говоря, они не удалили старые данные, а получили новые. Возможно, образцы из Google всегда неполные или они ожидают, что мы добавим для этого собственную реализацию (я не верю этому «или»).
Вместо удаления я попытался использовать стратегию конфликта, чтобы заменить существующие данные. Но я обнаружил, что он не удаляет старый.
// BoundaryCallback file
class PostBoundaryCallback (
):
PagedList.BoundaryCallback<Post>() {
private var lastRequestedPage = 1
init {
if(reset) {
// Deleting when flag is reset
appExecutors.diskIO().execute {
repository.delete(groupId)
}
lastRequestedPage = 1
}
}
override fun onZeroItemsLoaded() {
repository.requestAndSaveData(groupId, lastRequestedPage, userId)
}
override fun onItemAtEndLoaded(itemAtEnd: Post) {
if(reset) {
lastRequestedPage = 1
reset = false
} else {
lastRequestedPage += 1
}
repository.requestAndSaveData(groupId, lastRequestedPage, userId)
}
}
// Файл ViewModel
var postsForUser : LiveData<PagedList<Post>> = Transformations.switchMap(_resetAllPostsForUser) {
val factory = postDao.allPostsForUserWith(it.first)
factory.create()
val boundaryCallback = PostUserBoundaryCallback(it.first, repository, it.second, appExecutors)
LivePagedListBuilder(factory, 10)
.setBoundaryCallback(boundaryCallback)
.setFetchExecutor(appExecutors.diskIO())
.build()
}
// Деятельность
viewModel.posts.observe(this, Observer {
if(it.isNullOrEmpty()) {
noPostsLayout.visibility = View.VISIBLE
} else {
noPostsLayout.visibility = View.GONE
}
adapter.submitList(it)
if (swipeRefreshLayout.isRefreshing ) {
dswipeRefreshLayout.isRefreshing = false
}
hideProgressView()
})