简介

默认情况下,LazyColumn 在屏幕进行旋转之后仍然会保持之前滑动的状态,但是一旦应用重新启动,之前滑动的状态则会消失并且从第0条数据显示,下面将介绍如何持久保存和恢复LazyColumn的滚动位置。

示例

首先创建100条模拟数据

class MainActivity : ComponentActivity() {

	override fun onCreate(savedInstanceState: Bundle?) {
		super.onCreate(savedInstanceState)
		
		setContent {
			LazyColumnScrollPositionTheme {
				Surface(
					modifier = Modifier.fillMaxSize(),
					color = MaterialTheme.colorScheme.background
					) {   
						LazyColumn(
							state = lazyListState,
							modifier = Modifier.fillMaxSize(),
							contentPadding = PaddingValues(16.dp)
						) {
							items(100) {
								Text(
									text = "Item $it",
									modifier = Modifier.padding(16.dp)
								)
							}
						}
					}
				}
			}
		}
	}
}

创建 SharedPreferences 用于保存数据到本地,然后使用 rememberLazyListState 获取列表滑动的状态,通过 LaunchedEffect 监听它,一旦状态发生改变就会保存最新的状态。

//惰性列表状态
val lazyListState = rememberLazyListState(
	initialFirstVisibleItemIndex = xxx//设置初始化位置
)
//监听 lazyListState 的变化
LaunchedEffect(key1 = lazyListState) {
	snapshotFlow {
		lazyListState.firstVisibleItemIndex
	}
		.debounce(500L)
		.collectLatest { index ->
		//println("正在保存滑动下标")
			prefs.edit()
				.putInt("scroll_position", index)
				.apply()
		}
}

LazyColumn(
	state = lazyListState,
)
//省略部分代码
compose
compose - Docker Compose是一个用于定义和运行多容器Docker应用程序的工具,通过Compose文件格式简化应用部署过程。

官方文档解释:网址

使用 snapshotFlowState<T> 对象转换为冷 FlowsnapshotFlow 会在收集到块时运行该块,并发出从块中读取的 State 对象的结果。当在 snapshotFlow 块中读取的 State 对象之一发生变化时,如果新值与之前发出的值不相等,Flow 会向其收集器发出新值。

snapshotFlow 读取了第一个可见Item的下标转换为流,并且设置了 debounce 为500L,为什么要设置这个呢?原因在于:当用户滑动列表时 lazyListState 会一直进行刷新,例如滑动的次数是80次,那 prefs 要进行80次的保存操作,这样是非常不好的,所以设置500L毫秒的延迟,相当于防抖操作,具体效果可以通过Log查看。

保存的工作就已经做好了,现在就差如何恢复。在 onCreate() 方法中读取保存到的数据,并将其设置到 rememberLazyListStateinitialFirstVisibleItemIndex 中。

//启动的时候读取上次保存的滚动位置的值
override fun onCreate(savedInstanceState: Bundle?) {
	super.onCreate(savedInstanceState)

	//启动的时候读取上次保存的滚动位置的值
	val scrollPosition = prefs.getInt("scroll_position", 0)
	
	setContent{
		Surface(
			modifier = Modifier.fillMaxSize(),
			color = MaterialTheme.colorScheme.background
		) {
			//惰性列表状态
			val lazyListState = rememberLazyListState(
				initialFirstVisibleItemIndex = scrollPosition//设置初始化位置
			)

			//省略部分代码
	}
}

运行效果如下:
当我从0滑动到55后,重新打开应用依然是显示的55,说明我们的 LazyColumn 滑动位置恢复成功了。
在这里插入图片描述

推荐内容
阅读全文
AI总结
GitHub 加速计划 / compose / compose
86
5
下载
compose - Docker Compose是一个用于定义和运行多容器Docker应用程序的工具,通过Compose文件格式简化应用部署过程。
最近提交(Master分支:7 个月前 )
51907d9f Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com> 2 天前
a3f88a0a Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com> 2 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐