【问题标题】:Remember scroll position in lazycolumn?还记得lazycolumn 中的滚动位置吗?
【发布时间】:2021-05-21 17:51:10
【问题描述】:

我知道记住惰性列表状态,它工作正常

 setContent {       
       Test(myList) // Call Test with a dummy list
    }

  @Composable
    fun Test(data: List<Int>){
        val state = rememberLazyListState()

        LazyColumn(state = state) {
            items(data){ item ->Text("$item")}
          }
     }

它会记住滚动位置,并且在每次旋转和更改配置后都会保持相同
但是每当我尝试从数据库中捕获数据并使用诸如collectAsState之类的方法时
它不起作用,这似乎是一个问题

   setContent{
      val myList by viewModel.getList.collectAsState(initial = listOf())
      Test(myList)
   }

【问题讨论】:

  • 在 LazyColumn 项目上使用键,因此如果数据相同,则现在重新组合。

标签: android kotlin android-jetpack-compose


【解决方案1】:

不幸的是,目前还没有本地方法可以做到这一点,但您可以使用以下代码:

val listState = rememberLazyListState()

listState 有 3 个方法:

  • firstVisibleItemIndex
  • firstVisibleItemScrollOffset
  • isScrollInProgress

它们都是State(),因此您将始终在数据更新时获得数据。例如,如果您开始滚动列表,isScrollInProgress 将从false 更改为true

保存并恢复状态

val listState: LazyListState = rememberLazyListState(viewModel.index, viewModel.offset)

  LaunchedEffect(key1 = listState.isScrollInProgress) {
    if (!listState.isScrollInProgress) {
      viewModel.index = listState.firstVisibleItemIndex
      viewModel.offset = listState.firstVisibleItemScrollOffset
    }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多