You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 عبدالمؤمن

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:39:00