如何使用Paging3库在非首页启动?

问题描述 投票:0回答:2

我正在尝试使用

PagingSource
LazyPagingItems
LazyColumn
来显示延伸到过去和未来的数据集。

我希望列表的初始加载以“今天”为中心,并允许用户向上滚动以返回过去,向下滚动以及时前进。我的分页源码是用自定义键来实现的,但是原理和从非首页开始是一样的。

例如,如果我的第一页是

5
,我返回的第一个
LoadResult.Page
将如下所示:

LoadResult.Page(
    data = list,
    prevKey = 4,
    nextKey = 6
)

但是,如果我这样做,当加载第一页时,

LazyColumn
会立即触发上一页加载。我认为这是因为更新后它最初滚动到顶部,触发上一页加载。随着更多数据的加载,并且列表一遍又一遍地跳转到“new”顶部,这种情况会继续发生。这种情况会永远发生,加载过去的每一页,直到没有更多的页面为止。 如何防止上一页加载时Column跳到顶部? Paging3 不适合拥有一组双向数据吗?

android-jetpack-compose android-paging-3 lazycolumn
2个回答
0
投票

在不给出项目键的情况下,它们仅通过位置来标识,因此滚动状态尝试将第 0 个项目保持在顶部。所以我们永远跳起来。

我假设这些项目是通过 Compose 通过其他方式识别的,但不是,只是位置。


0
投票
LazyColumn

中的项目提供密钥。在这里,您可以使用

itemKey
函数来实现此目的,如下所示:
lazyPagingItems.itemKey { item -> item.key }

问题的出现是由于 
LazyColumn

的默认行为,当未提供显式键时,它仅通过索引来标识项目。因此,当新项目插入到列表的开头时,例如加载上一页时,现有项目的

索引会发生变化
。这会导致 LazyColumn 自动滚动到不同的项目,通常会导致无限向上滚动。 例如,当您当前正在查看索引 3 处的项目,然后加载上一页时,LazyColumn 会跳转到位于索引 3 处的新项目(向上滚动)。
通过为每个项目分配一个键,无论它们在列表中的位置如何,它们都会被唯一标识。因此,加载上一页后,

LazyColumn

仍聚焦于同一项目并阻止自动向上滚动。

    

© www.soinside.com 2019 - 2024. All rights reserved.