相关疑难解决方法(0)

Android Paging 3 库:如何使用新参数更改列表?

我有一个显示搜索项目列表的搜索片段。如果用户输入某些内容,我会将该字符串作为新的查询参数传递给 url,并使用 paging 3 库获取新列表。

第一个解决方案是:

//viewModel
lateinit var postListUrl: String

    val postList: Flow<PagingData<Post>> = Pager(PagingConfig(pageSize = 20)) {
        PostPagingSource(postRepository, postListUrl)
    }.flow.cachedIn(viewModelScope)

//fragment
fun showPostList(url: String) {
        postListAdapter.submitData(lifecycle, PagingData.empty())
        viewModel.postListUrl = url
        viewLifecycleOwner.lifecycleScope.launch {
            viewModel.postList.collectLatest {
                postListAdapter.submitData(it)
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

通过此解决方案,通过更改 url ( showPostList(newUrl),列表保持不变。也许在 viewModel 中使用缓存列表。

另一种解决方案是:使用showPostList(initUrl)in onViewCreatedof 片段,然后通过更改参数使用 blow 方法:

//fragment
fun changePostList(url: String) {
        viewModel.postListUrl = url
        postListAdapter.refresh()
    }
Run Code Online (Sandbox Code Playgroud)

这项工作有效,但如果旧列表和新列表有共同的项目,新列表将显示在最后一个共同的可见项目上。例如,如果旧列表的第 5 个位置项与新列表的第 7 个位置项相同,则在列表更改以显示新列表后,它将从第 7 个位置开始,而不是第一个项目。

在这里找到了另一个解决方案:

//viewModel
val postListUrlFlow = MutableStateFlow("") …
Run Code Online (Sandbox Code Playgroud)

android android-paging kotlin-flow android-paging-3

10
推荐指数
1
解决办法
4191
查看次数

在DataSource.Invalidate()之后,新的PagedList只有一页

我有一个使用分页库实现的分页列表。可以修改(更改/删除)此列表中的项目。根据官方文档,我首先要更改从中DataSource获取页面的内存列表缓存,然后再调用datasource.invalidate()以创建新的对PagedList/DataSource

如果您有更细致的更新信号,例如网络API发出对列表中单个项目的更新信号,则建议将数据从网络加载到内存中。然后通过包装内存中快照的数据源将数据提供给PagedList。每次内存中副本更改时,都将使先前的数据源无效,并且可以创建一个新的包装快照的新状态。

如果用户修改首页上的项目,它会正常工作,并且看起来很好。

但是,如果用户在第二页或第二页以上,datasource.invalidate()则将其扔到第一页的末尾

调试表明这种情况是因为新的PagedList具有唯一的第一页时,它的提交PagedListAdapter.submitList。适配器比较旧列表和新列表,并从第一页中删除所有项目。它总是发生,但如果用户在第一页上,则对用户不可见。

所以对我来说,似乎新的对PagedList/DataSource不知道获取前一对的页面数datasource.invalidate()不适合文档中的情况。我认为适用于某些情况的行为,然后用户更新了所有列表(例如刷卡刷新),但没有更新

列表中单个项目的更新

是否有人遇到过此类问题或以某种方式存档了我想要的东西?也许我缺少一些技巧,可以帮助我在PagedList所有页面上获得新的知识。

为了澄清:库版本2.1.0PageKeyedDataSource基于内存缓存和远程服务进行自定义(否Room

android android-architecture-components android-jetpack android-paging

6
推荐指数
1
解决办法
1371
查看次数