我有一些使用翻新程序获取的帖子列表。我正在使用Android Paging库来一次获取20条帖子。
假设这是我第二次打开该应用程序。我已经在数据库中有2个帖子,其中之一已从服务器中删除。
我开始活动后,便立即使用BoundaryCallback请求新数据。在获取新数据之前,我先删除导致问题的数据库中的数据。当我使用边界回调时,使用“无记录”图像视图向用户显示空数据,然后显示新数据。
我正试图避免显示无记录视图的更新。
这真的很烦人,去年我从Google下载了GitHub体系结构组件示例,而没有进行分页,他们试图避免在示例应用程序中解决这些问题而不是解决它。简而言之,他们没有删除旧数据,而是获取了新数据。可能是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()
})