Nat*_*hac 5 android kotlin android-paging android-paging-library android-paging-3
我将 Paging 3 与 RemoteMediator 和 Room 结合使用,通过 PagingDataAdapter 在 RecyclerView 中显示项目列表。我们遇到一个问题,当数据库中保存的基础数据多次更新时(在某些情况下),会导致列表跳转到开头。我已经成功创建了一个可重现的场景:
然后我执行以下操作之一:
看来潜在的问题是,在数据已经失效一次并且除当前页面之外的所有页面都已从回收器视图中删除后,分页库无法正确处理额外的数据库失效。
我的问题是:
存储库中的相关代码:
@MainThread
fun fetchNewData(...): LiveData<PagingData<DisplayCard>> {
val pagingSourceFactory = ... // Get appropriate PagingSource based on some conditions
@OptIn(ExperimentalPagingApi::class)
return Pager(
config = PagingConfig(
pageSize = DiscussionUseCase.PAGE_SIZE, // PAGE_SIZE = 20
prefetchDistance = 2,
enablePlaceholders = false,
initialLoadSize = DiscussionUseCase.PAGE_SIZE // PAGE_SIZE = 20
),
remoteMediator = ItemRemoteMediator(...),
pagingSourceFactory = pagingSourceFactory
).liveData
}
Run Code Online (Sandbox Code Playgroud)
房间查询之一 - 其他查询非常相似:
@Query("SELECT d.* FROM discussions AS d WHERE ... ORDER BY datetime(d.lastPostDate) DESC")
fun getCardList(query: String?): PagingSource<Int, DisplayCard>
Run Code Online (Sandbox Code Playgroud)
ViewModel的相关代码:
/**
* MediatorLiveData that is triggered every time one of the filters is changed and we have to fetch fresh data
*/
val listChanges = MediatorLiveData<ListChangesAction>()
val repoResult = listChanges.switchMap {
updateUI()
fetchNewData().cachedIn(viewModelScope)
}
Run Code Online (Sandbox Code Playgroud)
Activity 的相关代码:
viewModel.repoResult.observe(this) { pagingData ->
adapter.submitData(lifecycle, pagingData)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1898 次 |
| 最近记录: |