LazyColumn Jetpack Compose 中的当前滚动位置值(以像素为单位)

Ham*_*aei 11 android scroll android-jetpack android-jetpack-compose lazycolumn

我想要在 LazyColumn 中获得总滚动位置(以 px 为单位)。列本身有一个 ScrollState ,它有一个值(在文档中描述为以像素为单位的当前滚动位置值),但是 LazyColumn ScrollState 没有这个字段,我想要 LazyColumn 的 Column ScrollState 滚动位置值的完全相同,我如何可以借助 LazyScrollState 实现这一点吗?

use*_*854 1

它存在于 Column 中的原因是因为它在生成时知道所有项目(行)。

但是 LazyColumn 在任何给定时刻仅显示总视图的一部分,并且当您滚动时,它会不断地重新生成屏幕上的视图(加上可见区域上方和/或下方的几个视图),因此它实际上从未计算所有行的总高度。如果你想获得滚动位置,你必须手动计算它。如果每行的高度相同,效果会很好。但如果高度不同,那么您将无法获得准确的滚动位置(您的计算将根据当前显示的行的高度而波动)。但你必须自己计算一下:

计算所有项目的总大小

val totalItems = lazyListState.layoutInfo.totalItemsCount
val itemLengthInPx = lazyListState.layoutInfo.visibleItemsInfo.firstOrNull()?.size ?: 0
val totalLengthInPx = totalItems * itemLengthInPx 
Run Code Online (Sandbox Code Playgroud)

计算当前滚动位置

val scrollPos = (lazyListState.firstVisibleItemIndex * itemLengthInPx) / totalLengthInPx
Run Code Online (Sandbox Code Playgroud)

但正如我之前提到的,此计算取决于每个项目的高度 ( itemLengthInPx),如果所有视图都相同,则效果非常好。但是您可以看到如果每个视图具有不同的高度,它会如何波动

  • 这并不完全像“滚动位置”,每次滚动列表时,列中的滚动位置都会发生变化,并且第一项的偏移量会发生一点变化,但这样,如果列表的索引会更新该值,第一个可见项目更改 (firstVisibleItemIndex) (3认同)