提问人:beigirad 提问时间:11/6/2023 更新时间:11/6/2023 访问量:76
Jetpack compose 无限滚动侦听器
Jetpack compose infinity scroll listener
问:
我想在没有任何库的情况下通过 Jetpack Compose 中的 LazyColumn 实现无限滚动。换句话说,我需要在用户滚动到末尾时调用一个侦听器。
答:
1赞
beigirad
11/6/2023
#1
我使用了这个解决方案:
@Composable
inline fun LazyListState.scrollEndCallback(crossinline callback: () -> Unit) {
LaunchedEffect(key1 = this) {
snapshotFlow { layoutInfo }
.filter { it.totalItemsCount > 0 }
.map { it.totalItemsCount == (it.visibleItemsInfo.lastOrNull()?.index ?: -1).inc() }
.distinctUntilChanged()
.filter { it }
.onEach { callback() }
.collect()
}
}
其用途:
@Composable
fun Example() {
LazyColumn(
state = rememberLazyListState().also {
it.scrollEndCallback {
// do sth
}
},
) {
// items ....
}
}
此外,它可以与LazyGridState
评论
0赞
Thracian
11/6/2023
很好的解决方案,赞成,但它有 2 个问题。第一个是它最初调用数据,这在大多数情况下可能不是问题,但第二个是,如果项目的总高度小于 LazyColumn 的高度,它永远不会被调用
0赞
beigirad
11/6/2023
@Thracian 非常感谢。我添加了一个过滤器来修复初始呼叫。但我无法产生第二个音符。当我尝试为每个页面使用 2 个小项目并且按顺序调用回调以填充屏幕时,它工作正常。
0赞
Thracian
11/6/2023
对于第二个,当 LazyColumn 具有全屏高度时,用 3 或 5 个适合 LazyColumn 的项目填充 LazyColumn,如果没有什么可滚动的,则没有项目离开视口,因为我看到这个函数永远不会被调用。此外,在调用回调时,可能需要进行另一项检查。假设用户在获取数据时上下滚动,它将开始获取另一个数据,如果第二个请求在第一个请求之前完成,则可能会导致首先调用第二个调用
评论