使用 PagingDataAdapter 时如何恢复 recyclerview 滚动位置?

Doi*_*nhe 5 android kotlin android-architecture-components android-paging android-paging-library

我有一个应用程序,它从 API获取158 个项目的列表,将其存储在 Room 中,然后将其显示给用户。RoomDB 是事实的来源。

这是我的 ViewModel 上从数据库获取结果的代码:

private val pagingConfig =
    PagingConfig(pageSize = 20, enablePlaceholders = false, maxSize = 300)

fun getList(filters: Filters): Flow<PagingData<Character>> {
    return Pager(pagingConfig) {
        repository.getCharacters(filters)
    }.flow.map {
        it.asDomainModel()
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的片段上填充适配器的代码:

private fun fetchData(filters: Filters) {
    lifecycleScope.launch {
        charactersViewModel.getList(filters).collectLatest { pagedList ->
            characterAdapter.submitData(pagedList)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当前行为:

  • 当我的第 60 项之后发生配置更改时,滚动位置丢失,我发现将pagingConfig上的pageSize20增加到55,它解决了这个问题。

我已经尝试过的:

由于我获取数据异步我使用这段代码从这个尝试的文章,以防止在加载数据时适配器是空的。但它没有用

characterAdapter.stateRestorationPolicy = RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY
Run Code Online (Sandbox Code Playgroud)

我期望达到的目标:

能够滚动到列表底部并在不丢失滚动位置的情况下进行配置更改“无需随着列表变大而增加我的pageSize

https://github.com/doilio/DC-Characters

dla*_*lam 1

您正在寻找的方法是PagingSource.getRefreshKey(). 它给出了先前的状态 a PagingState,其中包含字段PagingState.anchorPosition,即最后访问的索引(包括占位符)。

https://developer.android.com/topic/libraries/architecture/paging/v3-network-db#refresh-in-place

编辑:我现在看到您正在使用 Room 的实现。实际上存在一些与 Remote REFRESH 及其 getRefreshKey 实现相关的错误,应在下一版本 (alpha07) 中解决。请参阅https://issuetracker.google.com/issues/167260236