获取具有特定阈值的当前可见项目的更新列表LazyListState
可以使用。
LazyListState
公开当前可见项目的列表List<LazyListItemInfo>
。很容易计算visibility percent
using
offset
and size
属性,从而将过滤器应用于可见列表visibility >= threshold
.
LazyListItemInfo
has index
属性,可用于映射LazyListItemInfo
传递给列表中的实际数据项LazyColumn
.
fun LazyListState.visibleItems(itemVisiblePercentThreshold: Float) =
layoutInfo
.visibleItemsInfo
.filter {
visibilityPercent(it) >= itemVisiblePercentThreshold
}
fun LazyListState.visibilityPercent(info: LazyListItemInfo): Float {
val cutTop = max(0, layoutInfo.viewportStartOffset - info.offset)
val cutBottom = max(0, info.offset + info.size - layoutInfo.viewportEndOffset)
return max(0f, 100f - (cutTop + cutBottom) * 100f / info.size)
}
Usage
val list = state.visibleItems(50f) // list of LazyListItemInfo
该列表必须首先映射到相应的项目LazyColumn
.
val visibleItems = state.visibleItems(50f)
.map { listItems[it.index] }
@Composable
fun App() {
val listItems = remember { generateFakeListItems().toMutableStateList() }
val state = rememberLazyListState()
LazyColumn(Modifier.fillMaxSize(), state = state) {
items(listItems.size) {
Item(listItems[it])
}
}
val visibleItems by remember(state) {
derivedStateOf {
state.visibleItems(50f)
.map { listItems[it.index] }
}
}
LaunchedEffect(visibleItems) {
Log.d(TAG, "App: $visibleItems")
}
}
fun generateFakeListItems() = (0..100).map { "Item $it" }