【问题标题】:Randomly Rearrange items in a LazyRow - Jetpack Compose随机重新排列 LazyRow 中的项目 - Jetpack Compose
【发布时间】:2021-09-16 13:31:13
【问题描述】:

我有一个 LazyRow。一切正常。我只希望每次在屏幕上绘制这个 LazyRow 时随机重新排列这些项目。这是我的代码:

LazyRow(
        reverseLayout = true,
        contentPadding = PaddingValues(top = twelveDp, end = eightDp)
    ) {
        itemsIndexed(
            items = featureUsersLazyPagingItems,
            key = { _, featuredPerson ->
                featuredPerson.uid
            }
        ) { _, featuredUser ->
            featuredUser?.let {
                //Daw the age suggested People
                DrawSuggestedPerson(featuredUser.toPersonUser(),) {
                    homeViewModel.deleteFeaturedUserFromLocalDb(featuredUser.uid)
                }
            }
        }

        featureUsersLazyPagingItems.apply {
            when {
                loadState.refresh is LoadState.Loading -> {
                    item {
                        ShowLazyColumnIsLoadingProgressBar()
                    }
                }
                loadState.append is LoadState.Loading -> {
                    item {
                        ShowLazyColumnIsLoadingProgressBar()
                    }
                }
                loadState.refresh is LoadState.Error -> {
                    val e = featureUsersLazyPagingItems.loadState.refresh as LoadState.Error
                    item {
                        LazyColumnErrorView(
                            message = e.error.localizedMessage!!,
                            onClickRetry = { retry() }
                        )
                    }
                }
                loadState.append is LoadState.Error -> {
                    val e = featureUsersLazyPagingItems.loadState.append as 
LoadState.Error
                    item {
                        LazyColumnErrorView(
                            message = e.error.localizedMessage!!,
                            onClickRetry = { retry() }
                        )
                    }
                }
            }
        }

所以 LazyRow 显示相同的一组 30 个左右的项目,但屏幕上只有 3-4 个项目可见,为了有点多样性,我希望重新排列这些项目,以便用户可以看到不同的项目屏幕上。有没有办法做到这一点?

【问题讨论】:

  • “每次用户导航到发出这个 LazyRow 的可组合” - 你能添加更多细节你的意思是什么?最初的动作是什么? LazyRow 视图出现/消失?你在说什么导航?
  • 我已经更新了问题,每次在屏幕上绘制 lAzyRow 时,我都希望重新排列它显示的项目列表
  • 它可以在某些状态变量发生变化时重新绘制,如果你使用动画,这可能发生在每一帧上,所以我想这不是你想要的。从用户的角度来看应该发生什么?用户转到另一个屏幕然后回来?
  • 如果在lazyRow 中设置后立即对数组列表进行洗牌怎么办?
  • @PhilipDukhov 这个 LazyRow 在我的 HomeActivity 上,所以每次用户打开应用程序时都会发生这种情况

标签: android-jetpack-compose android-jetpack-navigation


【解决方案1】:

您可以在remember 中打乱您的列表,通过这样做,您可以确定在一个视图出现期间您的顺序将是相同的,并且它将在下一个视图出现时被打乱。我将featureUsersLazyPagingItems 作为键传递,所以如果featureUsersLazyPagingItems 更改shuffledItems 将被重新计算。

val shuffledItems = remember(featureUsersLazyPagingItems) {
    featureUsersLazyPagingItems.shuffled()
}

remember 的唯一问题是它会在屏幕旋转时重置。不确定你是否需要,如果你想在旋转后保存状态,你需要使用rememberSaveable。由于它只能存储简单类型,而您的类不是,因此您可以存储索引,如下所示:

val shuffledItemIndices = rememberSaveable(featureUsersLazyPagingItems) {
    featureUsersLazyPagingItems.indices.shuffled()
}
val shuffledItems = remember(featureUsersLazyPagingItems, shuffledItemIndices) {
    featureUsersLazyPagingItems.indices
        .map(featureUsersLazyPagingItems::get)
}

我建议您查看 documentation 以了解状态如何在撰写中工作的详细信息。

【讨论】:

    猜你喜欢
    • 2022-11-08
    • 2022-09-26
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2022-10-04
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多