我想知道在达到列表底部时(类似于recyclerView.canScrollVertically(1)
),是否可以在@Compose
函数内获取观察者。
提前致谢。
我想知道在达到列表底部时(类似于recyclerView.canScrollVertically(1)
),是否可以在@Compose
函数内获取观察者。
提前致谢。
你可以使用rememberLazyListState()
并比较
scrollState.layoutInfo.visibleItemsInfo.lastOrNull()?.index == scrollState.layoutInfo.totalItemsCount - 1
使用示例:
首先将上述命令作为扩展添加(例如,extensions.kt
文件):
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
}
}
对我来说,最好和最简单的解决方案是在我的LazyColumn
中添加LaunchedEffect
作为最后一项:
LazyColumn(modifier = Modifier.fillMaxSize()) {
items(someItemList) { item ->
MyItem(item = item)
}
item {
LaunchedEffect(true) {
//Do something when List end has been reached
}
}
}
LaunchedEffect
(当然是通过viewModel)启动一个新的协程,它运行良好,所以如果你有这样的问题,这就是解决方案。尽管如此,这是一个很好的观点。 - Arkadiusz Mądry1.4.0-alpha03
开始,你可以使用 LazyListState#canScrollForward
来检查是否已经滑动到列表末尾。val state = rememberLazyListState()
val isAtBottom = !state.canScrollForward
LaunchedEffect(isAtBottom){
if (isAtBottom) doSomething()
}
在此版本之前,您可以使用LazyListState#layoutInfo
来获取有关可见项的信息。请注意,您应该使用derivedStateOf
以避免冗余的重新组合。
使用某物:
@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
}
lastVisibleItem.offset + lastVisibleItem.size <= viewportHeight
)。val state = rememberLazyListState()
var isAtBottom = state.isAtBottom()
LaunchedEffect(isAtBottom){
if (isAtBottom) doSomething()
}
LazyColumn(
state = state,
){
//...
}
val isAtBottom = !state.canScrollForward
?如果列表无法向前滚动,则它已经到底了。 - dannyroa根据其他答案,我认为recyclerView.canScrollVertically(1)
最佳解释是指底部滚动。
fun LazyListState.isScrolledToTheEnd() : Boolean {
val lastItem = layoutInfo.visibleItemsInfo.lastOrNull()
return lastItem == null || lastItem.size + lastItem.offset <= layoutInfo.viewportEndOffset
}
isScrolledToTheEnd()
为 true,而另一个答案只需要最后一个项目的一部分可见。当最后一个项目足够大以至于无法全部适合视图时,这一点非常重要。 - SjolfrlastItem == null || (lastItem.index == layoutInfo.totalItemsCount - 1 && lastItem.size + lastItem.offset <= layoutInfo.viewportEndOffset)
。 - Nasser GhodsianLazyColumn(
modifier = Modifier
.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally
) {
itemsIndexed(events) { i, event ->
if (lastIndex == i) {
Log.e("console log", "end of list reached $lastIndex")
}
}
}
只需使用 firstVisibleItemIndex
并将其与您的最后一个索引进行比较。如果匹配,则表示到达了末尾,否则不是。将其用作 lazyListState.firstVisibleItemIndex