使用分页库-数据库+网络

时间:2019-05-16 14:48:29

标签: android kotlin android-paging

我有一些使用翻新程序获取的帖子列表。我正在使用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()
})

0 个答案:

没有答案