我想检查列表是否滚动到列表的末尾,但是lazyListState
没有提供这个属性
为什么我需要这个?我想显示一个FAB的“滚动到年底”的列表,并隐藏它,如果最后一项已经可见
(Note:是的,但它是internal
/**
* Non-observable way of getting the last visible item index.
*/
internal var lastVisibleItemIndexNonObservable: DataIndex = DataIndex(0)
不知道为什么)
val state = rememberLazyListState()
LazyColumn(
state = state,
modifier = modifier.fillMaxSize()
) {
// if(state.lastVisibleItem == logs.length - 1) ...
items(logs) { log ->
if (log.level in viewModel.getShownLogs()) {
LogItemScreen(log = log)
}
}
}
那么,如何检查LazyColumn
是否滚动到数据集的末尾?
7条答案
按热度按时间suzh9iv81#
下面是您实现它的方法:
检查是否滚动到末尾的扩展功能:
示例用法:
结果:
https://im.ezgif.com/tmp/ezgif-1-b725f96cedd2.gif
ogq8wdun2#
我分享我的解决方案,以防它帮助任何人。
它提供了实现问题用例所需的信息,还通过遵循www.example.com的建议避免了无限的重新组合https://developer.android.com/jetpack/compose/lists#control-scroll-position。
1.创建这些扩展函数来计算列表状态所需的信息:
1.创建一个简单的数据类来保存要收集的信息:
1.创建此记忆组合返回上一个数据类。
注意,派生状态用于避免重组和提高性能。函数需要列表状态来在派生状态中进行计算。请阅读我上面分享的链接。
1.将所有内容粘贴到您的可组合:
干杯!
tzxcd3kk3#
现在已经太晚了,但也许这对其他人会有帮助。看到上面的答案,
layoutInfo.visibleItemsInfo.lastIndex
会导致重组很多次,因为它是由状态组成的。所以我建议在item(key = "lastIndexKey")
中对derivedState
和itemKey
使用下面的语句。juzqafwq4#
从
1.4.0-alpha03
开始,您可以使用**LazyListState#canScrollForward
**检查是否可以向前滚动或是否位于列表末尾。之前,您可以使用包含有关可见项目信息的**
LazyListState#layoutInfo
。如果列表在底部滚动,您可以使用它检索信息。由于您正在阅读
state
,因此应该使用derivedStateOf
**以避免冗余的重新组合。比如:
kkih6yb85#
我找到的当前解决方案是:
该声明
lastDataIndex - state.firstVisibleItemIndex == state.layoutInfo.visibleItemsInfo.size - 1
通过从第一个可见项中减去数据集的最后一个索引并检查它是否等于 * 可见项计数 * 来猜测最后一个项
wqnecbli6#
只是想建立在一些其他的答案张贴在这里。
@Tuan Chau在评论中提到,这将导致无限的合成,这里是我尝试使用他的想法来避免这一点,它似乎工作正常。开放的想法如何使它更好!
扩展功能:
用法:
x33g5p2x7#
试试这个: