在jetpack compose LazyColumn中获取最后一个可见的项目索引

Posted

技术标签:

【中文标题】在jetpack compose LazyColumn中获取最后一个可见的项目索引【英文标题】:Get last visible item index in 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。 不。只想显示一个“滚动到结束”工厂 【参考方案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 通过从第一个可见项目中减去数据集的最后一个索引并检查它是否等于 可见项目计数

来猜测最后一个项目

【讨论】:

以上是关于在jetpack compose LazyColumn中获取最后一个可见的项目索引的主要内容,如果未能解决你的问题,请参考以下文章

Android Jetpack Compose学习—— Jetpack compose基础布局

什么是Jetpack Compose?带你走进Jetpack Compose~

Android Jetpack Compose学习—— Jetpack compose入门

Android Jetpack Compose学习—— Jetpack compose入门

jetpack compose 接收返回参数

Jetpack All In Compose ?看各种Jetpack库在Compose中的使用