![](/img/trans.png)
[英]Remember LazyColumn Scroll Position - Jetpack Compose
[英]Current scroll position value in pixels in LazyColumn Jetpack Compose
我想要在 LazyColumn 中以 px 為單位的總滾動 position。 該列本身有一個 ScrollState,它有一個值(在文檔中描述為當前滾動 position 值(以像素為單位)),但是 LazyColumn ScrollState 沒有這個字段,我想要完全等同於 LazyColumn 的 Column ScrollState 滾動 position 值,我如何可以借助 LazyScrollState 實現嗎?
它存在於 Column 中的原因是因為它在生成時知道所有項目(行)。
但是 LazyColumn 在任何給定時刻僅顯示總視圖的一部分,並且當您滾動時,它會不斷地在屏幕上重新生成視圖(加上可見區域上方和/或下方的一對),因此它從不實際計算所有行的總高度。 如果您想獲得卷軸 position,則必須手動計算。 如果每行的高度相同,它會工作得很好。 但是如果高度不同,那么您將無法獲得精確的滾動 position(您的計算將根據當前顯示的行的高度而波動)。 但是,您必須自己進行計算:
計算所有項目的總大小
val totalItems = lazyListState.layoutInfo.totalItemsCount
val itemLengthInPx = lazyListState.layoutInfo.visibleItemsInfo.firstOrNull()?.size ?: 0
val totalLengthInPx = totalItems * itemLengthInPx
計算當前滾動 position
val scrollPos = (lazyListState.firstVisibleItemIndex * itemLengthInPx) / totalLengthInPx
但正如我之前提到的,這個計算取決於每個項目的高度( itemLengthInPx
),如果所有視圖都相同,它就可以完美地工作。 但是你可以看到如果每個視圖都有不同的高度,它會如何波動
通過將onGloballyPosition{ it.positionInParent()}
修飾符附加到一個或多個項目,可以在項目本身中獲得滾動量,無需計算。
然后,項目可以用自己的滾動position來做他們需要做的事情,例如偏移一些屏幕繪圖的y坐標。
或者,如果您需要父 LazyColumn 中的滾動偏移量,您可以在項目列表的最頂部有一個項目(可能是高度為零的項目,盡管我沒有測試過),它會將其 position 報告給每當它移動時,父級(可能通過更新由父級傳遞給項目的 mutableState)。
我有同樣的需求, onGloballyPosition{ it.positionInParent()}
很好地解決了這個問題。
您可以通過firstVisibleItemScrollOffset
獲取它。
('androidx.activity:activity-compose:1.3.1')
val listState = rememberLazyListState()
val itemHeight = with(LocalDensity.current) { 80.dp.toPx() } // Your item height
val scrollPos = listState.firstVisibleItemIndex * itemHeight + listState.firstVisibleItemScrollOffset
Text(text = "scroll: $scrollPos")
LazyColumn(state = listState) {
// Your items here
}
此外,您可以將滾動條 position 設置為listState
,如下所示:
LaunchedEffect(key1 = "Key") {
delay(1000) // To show scroll explicitly, set the delay
listState.scrollBy(itemHeight * 2)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.