Jetpack Compose 列表滚动到底部监听实现(类似RecyclerView的canScrollVertically)
Jetpack Compose 监听列表滚动到底部实现方案
在Jetpack Compose中完全可以实现和RecyclerView canScrollVertically(1)等价的判断逻辑,核心依赖LazyListState提供的官方API实现:
基础实现
LazyListState的canScrollForward属性直接对应RecyclerView的canScrollVertically(1)返回值,当canScrollForward为false时说明列表已经滚动到最底部,无法继续向下滚动。
完整示例代码如下:
@Composable fun ScrollBottomDetectList() { // 存储列表滚动状态,必须用remember避免重组丢失 val listState = rememberLazyListState() // 监听是否触底的状态,用derivedStateOf优化性能,仅状态变化时触发更新 val isAtBottom by remember { derivedStateOf { !listState.canScrollForward } } // 触底时触发业务逻辑示例(比如加载更多) LaunchedEffect(isAtBottom) { if (isAtBottom) { // 执行触底操作,例如下一页数据请求 } } LazyColumn(state = listState) { items(100) { index -> Text( text = "列表项 $index", modifier = Modifier .fillMaxWidth() .padding(vertical = 12.dp, horizontal = 16.dp) ) } } }
常见场景扩展
- 如果你需要判断最后一个列表项完全露出才判定为触底,可以替换
derivedStateOf内的判断逻辑:derivedStateOf { val layoutInfo = listState.layoutInfo val lastVisibleItem = layoutInfo.visibleItemsInfo.lastOrNull() lastVisibleItem?.index == layoutInfo.totalItemsCount - 1 && lastVisibleItem.offset + lastVisibleItem.size <= layoutInfo.viewportEndOffset } - 横向滚动的
LazyRow逻辑完全一致,仅需将LazyColumn替换为LazyRow即可,canScrollForward同样适用,等价于RecyclerView的canScrollHorizontally(1) - 对于带粘性头部、分隔线的列表,上述判断逻辑无需额外调整,
LazyListState会自动计算这些装饰元素的尺寸偏移
内容的提问来源于stack exchange,提问作者AbdulMomen عبدالمؤمن
相关产品推荐
相关产品推荐

