我使用寻呼库3与一个RemoteMediator,其中包括从网络加载数据和本地房间数据库。每当我滚动到RecyclerView中的某个位置,导航到另一个片段,然后使用列表导航回片段时,滚动状态就不会被保留,RecyclerView将显示来自第一项的列表,而不是我导航之前的位置。
我尝试过使用StateRestorationPolicy而没有运气,并且似乎找不出一种方法来获得PagingDataAdapter的滚动位置,并在导航回片段时将其恢复到相同的位置。
在我的ViewModel中,我有一个从RemoteMediator收集数据的流:
val flow = Pager(config = PagingConfig(5), remoteMediator = remoteMediator) {
dao?.getListAsPagingSource()!!
}.flow.cachedIn(viewModelScope)我正在将这些数据提交给我的片段中的适配器:
viewLifecycleOwner.lifecycleScope.launch {
viewModel.flow.collectLatest { pagingData ->
adapter?.submitData(pagingData)
}
}在片段的顶部,我的适配器列出如下:
class MyFragment : Fragment() {
...
private var adapter: FeedAdapter? = null
...
override onViewCreated(...) {
if (adapter == null) {
adapter = FeedAdapter(...)
}
recyclerView.adapter = adapter
viewLifecycleOwner.lifecycleScope.launch {
viewModel.flow.collectLatest { pagingData ->
adapter?.submitData(pagingData)
}
}
}
}如何确保适配器在用户返回时离开片段之前准确地显示列表,而不是在第一个位置重新启动列表?
发布于 2021-06-10 18:11:44
在片段的onViewCreated中这样做:
viewLifecycleOwner.lifecycleScope.launch {
viewModel.flow.collect { pagingData ->
adapter.submitData(viewLifecycleOwner.lifecycle, pagingData)
}
}发布于 2022-11-06 19:04:18
在检查了许多解决方案之后,这是对我有效的方法cachedIn()。
fun getAllData() {
viewModelScope.launch {
_response.value = repository.getPagingData().cachedIn(viewModelScope)
}
}https://stackoverflow.com/questions/67743082
复制相似问题