fun LazyListState.isScrolledToEnd() = layoutInfo.visibleItemsInfo.lastOrNull()?.index == layoutInfo.totalItemsCount - 1
然后在下面的代码中使用它:
@Compose
fun PostsList() {
val scrollState = rememberLazyListState()
LazyColumn(
state = scrollState,),
) {
...
}
// observer when reached end of list
val endOfListReached by remember {
derivedStateOf {
scrollState.isScrolledToEnd()
}
}
// act when end of list reached
LaunchedEffect(endOfListReached) {
// do your stuff
}
}
@Composable
private fun LazyListState.isAtBottom(): Boolean {
return remember(this) {
derivedStateOf {
val visibleItemsInfo = layoutInfo.visibleItemsInfo
if (layoutInfo.totalItemsCount == 0) {
false
} else {
val lastVisibleItem = visibleItemsInfo.last()
val viewportHeight = layoutInfo.viewportEndOffset + layoutInfo.viewportStartOffset
(lastVisibleItem.index + 1 == layoutInfo.totalItemsCount &&
lastVisibleItem.offset + lastVisibleItem.size <= viewportHeight)
}
}
}.value
}
上面的代码不仅检查列表中的最后一个visibile item == last index,还检查它是否完全可见(lastVisibleItem.offset + lastVisibleItem.size <= viewportHeight)。 然后:
val state = rememberLazyListState()
var isAtBottom = state.isAtBottom()
LaunchedEffect(isAtBottom){
if (isAtBottom) doSomething()
}
LazyColumn(
state = state,
){
//...
}
6条答案
按热度按时间rwqw0loc1#
可以使用
rememberLazyListState()
并比较如何使用示例:
首先添加上述命令作为扩展名(例如,
extensions.kt
文件):然后在下面的代码中使用它:
xpcnnkqh2#
对我来说,最好也是最简单的解决方案是添加
LaunchedEffect
作为LazyColumn
中的最后一项:gab6jxml3#
基于另一个答案,我认为
recyclerView.canScrollVertically(1)
涉及底部滚动的最佳解释是xe55xuns4#
只需使用
firstVisibleItemIndex
并将其与上一个索引进行比较。如果匹配,则您位于末尾,否则不位于末尾。将其用作lazyListState.firstVisibleItemIndex
uz75evzq5#
找到了一个比其他答案简单得多的解决方案。获取list的最后一项索引。在lazyColumn的itemsIndexed内部将其与lastIndex进行比较。当到达list末尾时,它将触发if语句。代码示例:
zqry0prt6#
从
1.4.0-alpha03
开始,您可以使用**LazyListState#canScrollForward
**检查您是否位于列表末尾。比如:
在此版本之前,您可以使用包含可见项信息的**
LazyListState#layoutInfo
**。请注意,您应该使用derivedStateOf
以避免重复的重新组合。使用一些东西:
上面的代码不仅检查列表中的最后一个
visibile item == last index
,还检查它是否完全可见(lastVisibleItem.offset + lastVisibleItem.size <= viewportHeight
)。然后: