我有一個包含專案的惰性行。現在,每當用戶滾動惰性行時,我想對在視口中完全可見的專案進行 API 呼叫。
我嘗試了以下代碼:
listState = rememberLazyListState()
LaunchedEffect(listState){
snapshotFlow { listState.firstVisibleItemIndex }
.collectLatest{
Log.d("printed Item", listState.firstVisibleItemIndex.toString())
}}
這段代碼的問題是:
- 即使第二個專案占據了視口,它也不會被列印,除非第一個專案完全不可見。
- 對于平板電腦,由于它們的大螢屏尺寸,即使螢屏上有 2 個可見專案,也只會對第一個可見專案進行 API 呼叫。請參閱螢屏截圖。
當第一項部分可見而第二項完全可見時 [1]:https ://i.stack.imgur.com/l5QcB.jpg
當第二個瓦片完全可見而第一個瓦片完全不可見時[2]:https ://i.stack.imgur.com/6rmiQ.jpg
對于完全可見 2 個專案的平板電腦 [3]:https ://i.stack.imgur.com/QYRTI.jpg
誰能告訴我如何解決我的問題?提前致謝。
uj5u.com熱心網友回復:
有關可見專案的所有資訊都可在 中找到state.layoutInfo。要檢查專案是否可見,您需要根據視口大小比較第一個和最后一個專案的位置(所有其他專案肯定是可見的)。
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)
)
}
}
不確定您將如何在現實生活中使用此資訊,如果您確實需要更新專案視圖,出于性能原因,最好將此邏輯移動到每個內部item以不觸發整體的重組LazyColumn
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488247.html
標籤:安卓 安卓布局 android-jetpack-compose
