当前位置: 首页 > 知识库问答 >
问题:

材料滑动以在 Jetpack 中消除 用列而不是懒惰列组成

卢鸿博
2023-03-14

在我的Jetpack Compose项目中,我想使用Material SwipeToDismiss通过滑动删除项目。在我的可组合中,我在列表中使用列而不是懒惰列。问题在于,当删除项目时,将开始重新组合,并且所有后续项目也将被删除(因为下一个项目的 dismissState 似乎相同)。例如,如果列有 7 个项目,而我删除了项目 #5,则项目 #6 和项目 #7 也会被删除。

如果我使用一个固定高度的懒散列(可能是因为键),它会工作,但我只想要一个没有滚动或固定高度的项目列表。有什么建议可以让它运行吗?

@OptIn(ExperimentalMaterialApi::class)
@Composable
private fun DocumentationsList(
    modifier: Modifier = Modifier,
    task: DBTask,
    documentations: List<DBDocumentation>,
    onDocumentationDelete: (DBDocumentation) -> Unit,
) {

    Column(
        modifier = modifier
    ) {
        for ((index, documentation) in documentations.withIndex()) {

            var dismissState = rememberDismissState(initialValue = DismissValue.Default)
            if (dismissState.isDismissed(DismissDirection.EndToStart)) {
                onDocumentationDelete(documentation)
            }

            SwipeToDismiss(
                state = dismissState,
                modifier = Modifier.padding(vertical = 4.dp),
                directions = setOf(DismissDirection.EndToStart),
                dismissThresholds = { direction ->
                    FractionalThreshold(if (direction == DismissDirection.StartToEnd) 0.25f else 0.5f)
                },
                background = {
                    val direction = dismissState.dismissDirection ?: return@SwipeToDismiss
                    val color by animateColorAsState(
                        when (dismissState.targetValue) {
                            DismissValue.Default -> Color.LightGray
                            DismissValue.DismissedToEnd -> Color.Green
                            DismissValue.DismissedToStart -> Color.Red
                        }
                    )
                    val alignment = when (direction) {
                        DismissDirection.StartToEnd -> Alignment.CenterStart
                        DismissDirection.EndToStart -> Alignment.CenterEnd
                    }
                    val icon = when (direction) {
                        DismissDirection.StartToEnd -> Icons.Default.Done
                        DismissDirection.EndToStart -> Icons.Default.Delete
                    }
                    val scale by animateFloatAsState(
                        if (dismissState.targetValue == DismissValue.Default) 0.75f else 1f
                    )

                    Box(
                        Modifier.fillMaxSize().background(color).padding(horizontal = 20.dp),
                        contentAlignment = alignment
                    ) {
                        Icon(
                            icon,
                            contentDescription = "Localized description",
                            modifier = Modifier.scale(scale)
                        )
                    }
                },
                dismissContent = {
                    Card(
                        elevation = animateDpAsState(
                            if (dismissState.dismissDirection != null) 4.dp else 0.dp
                        ).value
                    ) {
                        
                        // Layout here
                    }
                }
            )
        }
    }

共有1个答案

章远航
2023-03-14

您可以使用,它将使用相同的懒散列键</code>参数:

Column(
    modifier = modifier
) {
    for ((index, documentation) in documentations.withIndex()) {
        key(uniqueKey) {
            // your view
        }
    }
}

这不应该是您的index,因为它会在删除后更改删除项以下的所有项目,它应该是集合中每个项目唯一的某个标识符。

 类似资料:
  • 目前在Jetpack Compose中,此代码会抛出一个,因为您无法嵌套两个垂直滚动的Composables: 我不希望网格本身滚动,而只是显示我传递到其中的可组合的固定网格。在 中显示非滚动网格是否有任何解决方法?

  • 问题内容: 我想创建自己的集合,该集合具有python list的所有属性,并且还知道如何将自身保存到数据库中或从数据库中加载。我也想使负载隐式和惰性,因为在列表创建时它不会发生,而是等到第一次使用时才发生。 有没有一种单一的方法,我可以覆盖上加载任何列表属性(如第一次使用清单,,而不必重写他们… …等)? 问题答案: 不,没有。

  • 我想以编程方式更改当用户滚动下面列表中的每个“查看更多”项目时选择的选项卡。我如何才能最好地完成这项工作?

  • 我有一个实体: 然后我有一个控制器,其目的是检索书籍,我的问题是,我的控制器的json响应中包含了流派字段。有没有办法排除jackson序列化对象时延迟加载的字段? 这是我的ObjectMapper的配置: 谢谢 我不能将其标记为JsonIgnore,因为它将永远脱离序列化框。有时我需要检索书籍的体裁,到那时,我将在查询中使用“fetch join”,这样它就不会为空。

  • 如何从下方显示惰性列?默认情况下,它显示上面的列表

  • 我有一个包含多个< code>LazyRow的< code>LazyColumn。在旧术语中,嵌套RecyclerView。 我的问题是,当移动到一个新的可组合(不同的选项卡)时,不会恢复滚动状态。但是内部s恢复它们的状态。 例如,打开主屏幕,滚动到底部,然后滚动结束,然后打开不同的选项卡并再次返回主选项卡。 的产品进行评级 如何恢复滚动状态?