Jetpack compose 无限滚动侦听器

Jetpack compose infinity scroll listener

提问人:beigirad 提问时间:11/6/2023 更新时间:11/6/2023 访问量:76

问:

我想在没有任何库的情况下通过 Jetpack Compose 中的 LazyColumn 实现无限滚动。换句话说,我需要在用户滚动到末尾时调用一个侦听器。

android kotlin android-jetpack-compose 无限滚动 lazycolumn

评论

0赞 Thracian 11/6/2023
当用户滚动到最后时,您希望做什么?滚动到第一项作为循环列表还是获取新项目作为分页?
0赞 beigirad 11/6/2023
@Thracian获取新项目作为分页。

答:

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,如果没有什么可滚动的,则没有项目离开视口,因为我看到这个函数永远不会被调用。此外,在调用回调时,可能需要进行另一项检查。假设用户在获取数据时上下滚动,它将开始获取另一个数据,如果第二个请求在第一个请求之前完成,则可能会导致首先调用第二个调用