gpt4 book ai didi

android - 如何知道在jetpack compose的惰性行的视口(viewport)中完全可见的项目?

转载 作者:行者123 更新时间:2023-12-04 23:44:30 25 4
gpt4 key购买 nike

我有一个包含项目的惰性行。现在,每当用户滚动惰性行时,我想对在视口(viewport)中完全可见的项目进行 API 调用。
我尝试了以下代码:

    listState = rememberLazyListState()
LaunchedEffect(listState){
snapshotFlow { listState.firstVisibleItemIndex }
.collectLatest{
Log.d("printed Item", listState.firstVisibleItemIndex.toString())
}}
这段代码的问题是:
  • 即使第二个项目占据了视口(viewport),它也不会被打印,除非第一个项目完全不可见。
  • 对于平板电脑,由于它们的大屏幕尺寸,即使屏幕上有 2 个可见项目,也只会对第一个可见项目进行 API 调用。请参阅屏幕截图。

  • 当第一个项目部分可见而第二个项目完全可见时
    [1]: /image/l5QcB.jpg
    当第二个图 block 完全可见而第一个图 block 完全不可见时
    [2]: /image/6rmiQ.jpg
    对于完全可见 2 个项目的平板电脑
    [3]: /image/QYRTI.jpg
    谁能告诉我如何解决我的问题?

    最佳答案

    state.layoutInfo 中提供了有关可见项目的所有信息.要检查项目是否可见,您需要根据视口(viewport)大小比较第一个和最后一个项目的位置(所有其他项目肯定是可见的)。

    val state = rememberLazyListState()
    val fullyVisibleIndices: List<Int> by remember {
    derivedStateOf {
    val layoutInfo = state.layoutInfo
    val visibleItemsInfo = layoutInfo.visibleItemsInfo
    if (visibleItemsInfo.isEmpty()) {
    emptyList()
    } else {
    val fullyVisibleItemsInfo = visibleItemsInfo.toMutableList()

    val lastItem = fullyVisibleItemsInfo.last()

    val viewportHeight = layoutInfo.viewportEndOffset + layoutInfo.viewportStartOffset

    if (lastItem.offset + lastItem.size > viewportHeight) {
    fullyVisibleItemsInfo.removeLast()
    }

    val firstItemIfLeft = fullyVisibleItemsInfo.firstOrNull()
    if (firstItemIfLeft != null && firstItemIfLeft.offset < layoutInfo.viewportStartOffset) {
    fullyVisibleItemsInfo.removeFirst()
    }

    fullyVisibleItemsInfo.map { it.index }
    }
    }
    }
    LazyColumn(
    state = state,
    contentPadding = PaddingValues(30.dp)
    ) {
    items(100) {
    Text(
    it.toString(),
    modifier = Modifier
    .background(if (fullyVisibleIndices.contains(it)) Color.Green else Color.Transparent)
    .padding(30.dp)
    )
    }
    }
    不确定您将如何在现实生活中使用此信息,如果您确实需要更新项目 View ,出于性能原因,最好将此逻辑移动到每个 item 中不触发整个 LazyColumn 的重组

    关于android - 如何知道在jetpack compose的惰性行的视口(viewport)中完全可见的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72415419/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com