【问题标题】:Get last visible item index in jetpack compose LazyColumn在jetpack compose LazyColumn中获取最后一个可见的项目索引
【发布时间】:2021-06-17 02:31:06
【问题描述】:

我想检查列表是否滚动到列表的末尾lazyListState 怎么不提供这个属性

我为什么需要这个?我想为列表的“滚动到结尾”显示一个 FAB,如果最后一项已经可见,则隐藏它

(注意:有,但它是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 是否滚动到数据集的末尾?

【问题讨论】:

  • 如果您的目标是此时加载更多数据,请考虑使用 Paging for Compose。
  • 不。只想显示一个“滚动到结束”工厂

标签: android android-jetpack-compose


【解决方案1】:

这是一种实现方式:

检查是否滚动到末尾的扩展功能:

fun LazyListState.isScrolledToTheEnd() = layoutInfo.visibleItemsInfo.lastOrNull()?.index == layoutInfo.totalItemsCount - 1

使用示例:

val listState = rememberLazyListState()
val listItems = (0..25).map { "Item$it" }

LazyColumn(state = listState, modifier = Modifier.fillMaxSize()) {
    items(listItems) { item ->
        Text(text = item, modifier = Modifier.padding(16.dp))
    }
}

Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.BottomEnd) {
    if (!listState.isScrolledToTheEnd()) {
        ExtendedFloatingActionButton(
            modifier = Modifier.padding(16.dp),
            text = { Text(text = "Go to Bottom") },
            onClick = { /* Scroll to the end */}
        )
    }
}

结果:

https://im.ezgif.com/tmp/ezgif-1-b725f96cedd2.gif

【讨论】:

  • 链接失效
  • 访问layoutInfoLazyListState 会导致重新组合,然后以无限组合结束。避免这种情况的一个技巧是记住 firstVisibleItemIndex 并在获取 layoutInfo 之前检查值是否已更改
【解决方案2】:

我找到的当前解决方案是:

LazyColumn(
    state = state,
    modifier = modifier.fillMaxSize()
) {
    if ((logs.size - 1) - state.firstVisibleItemIndex == state.layoutInfo.visibleItemsInfo.size - 1) {
        println("Last visible item is actually the last item")
        // do something
    }
    items(logs) { log ->
        if (log.level in viewModel.getShownLogs()) {
            LogItemScreen(log = log)
        }
    }
}

声明
lastDataIndex - state.firstVisibleItemIndex == state.layoutInfo.visibleItemsInfo.size - 1
通过从第一个可见项目中减去数据集的最后一个索引并检查它是否等于 可见项目计数

来猜测最后一个项目

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 2022-10-04
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2021-03-11
    • 2022-09-26
    相关资源
    最近更新 更多