【问题标题】:Jetpack Compose: how to reset LazyListState?Jetpack Compose:如何重置 LazyListState?
【发布时间】:2022-10-23 20:12:47
【问题描述】:

我有一个 LazyColumn 嵌套 LazyRows(类似于 Netflix 或 Spotify 主页提要)。我有一个LazyListState 被传递给LazyColumn。当用户滚动列表时,我使用这个LazyListState 进行一些 UI 更改。

我有一个重置按钮,单击该按钮时我想向上滚动列表并重置页面。这样做是这样的:

    LaunchedEffect(
        key1 = scrollToTopState,
    ) {
        if (scrollToTopState) {
            listState.scrollToItem(0)
            viewModel.updateScrollState(false)
        }
    }

它按预期工作。但是问题是它不会重置嵌套LazyRows 的位置。是否可以将LazyListState 及其嵌套行重置为全部滚动到初始位置?我不想为所有行维护ListState,所以我希望这里有一个更简单的解决方案。谢谢!

【问题讨论】:

  • 每个 LazyRow 都应该具有完全相同的 LaunchedEffect 重置自己的列表状态
  • 感谢@vitidev 的评论。是的,这就是我在问题中提到的,这是我能想到的解决方案。但我希望有一个更简单的解决方案,因为这个解决方案不能很好地扩展。

标签: android android-jetpack-compose


【解决方案1】:

您可以为每个内部 LazeRows 创建lazyListState 并将它们添加到launchEffect:

LaunchedEffect(
    key1 = scrollToTopState,
) {
    if (scrollToTopState) {
        listState.scrollToItem(0)

        //Added these lines
        lazyRowStateOne.scrollToItem(0)
        lazyRowStateTwo.scrollToItem(0)
        
        viewModel.updateScrollState(false)
    }
}

但就个人而言,我更喜欢创建一个 lambda 而不是在这种情况下使用 LaunchedEffect:

val lazyColumnState = rememberLazyListState()
val lazyRowOneState = rememberLazyListState()
val lazyRowTwoState = rememberLazyListState()

val coroutineScope = rememberCoroutineScope()

val resetLazyLists: () -> Unit = {
    coroutineScope.launch {
        lazyColumnState.scrollToItem(0)
        lazyRowOneState.scrollToItem(0)
        lazyRowTwoState.scrollToItem(0)
    }
}

LazyColumn(state = lazyColumnState) {
    //...
    item{ LazyRow(state = lazyRowOneState) {} }
    //...
    item{ LazyRow(state = lazyRowTwoState) {} }
    //...
}

Button(onClick = resetLazyLists) {
    Text(text = "Reset scroll")
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2022-11-25
    • 2022-09-28
    • 1970-01-01
    • 2021-06-01
    • 2020-04-29
    • 1970-01-01
    相关资源
    最近更新 更多