我有一个带有可展开项目的LazyColumn.当我点击项目时,他会展开或折叠,但我需要的是,当我点击关闭的元素时,它会打开,列表中的其他元素会关闭.(打开的那个).因此,首先我将项的状态从项的可组合函数中的记住变量移到了dataClass元素列表中.当我点击Items时,它会回调列表中所选元素的更改值,但它不会重新组合.

@Preview
@Composable
fun ExpandableCardList() {
    val list = remember { mutableStateListOf(PointsCard(0),PointsCard(1),PointsCard(2),PointsCard(3),PointsCard(4),PointsCard(5))}
    val state = rememberLazyListState()
    Scaffold { paddingValues ->
        LazyColumn(
            state = state,
            modifier = Modifier
                .fillMaxWidth(),
            contentPadding = paddingValues
        ) {
            items(list, {it.key}) { item ->
                ExpandableCard(
                    expanded = item.state,
                    state = {
                        bool ->  item.state = bool
                    }
                )
            }
        }
    }
}
@Composable
fun ExpandableCard(expanded: Boolean, state: (bool:Boolean) -> Unit ){
    Card(
        Modifier
            .fillMaxWidth()
            .clickable { state(!expanded) }
            .background(Color(Color.BLACK))
    ) {
        Column(Modifier.background(Color(Color.BLACK)))
        {
            Box(
                Modifier
                    .fillMaxWidth()
                    .height(54.dp)
                    .background(Color(Color.BLACK))
            )
            AnimatedVisibility(expanded) {
                Box(
                    Modifier
                        .fillMaxWidth()
                        .padding(start = 10.dp)
                        .heightIn(56.dp, 300.dp)
                        .background(Color(Color.BLACK), shape = RoundedCornerShape(bottomStart = 8.dp)
                        )
                )
            }
       }
    }
}
data class PointsCard(
    val key: Int = 0,
    var state: Boolean = false
)

推荐答案

如果您想要一个单一的 Select ,您可能应该考虑将您的List放在一个类中,并通过List的迭代器执行所有 struct 更改.

class CardListState {
    val list = mutableStateListOf(PointsCard(0),PointsCard(1),PointsCard(2),PointsCard(3),PointsCard(4),PointsCard(5))

    fun onSelected(isSelected: Boolean, item: PointsCard) {
        val iterator = list.listIterator()
        while (iterator.hasNext()) {
            val obj = iterator.next()
            if (obj.key != item.key) {
                iterator.set(obj.copy(state = false))
            } else {
                iterator.set(obj.copy(state = isSelected))
            }
        }
    }
}

@Composable
fun ExpandableCardList() {

    val cardListState = remember { CardListState() }
    val state = rememberLazyListState()

    Scaffold { paddingValues ->
        LazyColumn(
            state = state,
            modifier = Modifier
                .fillMaxWidth(),
            contentPadding = paddingValues
        ) {
            items(cardListState.list, {it.key} ) { item ->
                ExpandableCard(
                    expanded = item.state,
                    state = { bool ->
                        cardListState.onSelected(bool, item)
                    }
                )
            }
        }
    }
}

@Composable
fun ExpandableCard(
    expanded: Boolean,
    state: (bool:Boolean) -> Unit
) {
    Card(
        Modifier
            .fillMaxWidth()
            .clickable {
                state(!expanded)
            }
            .background(Color.Black)
    ) {
        Column(Modifier.background(Color.Black))
        {
            Box(
                Modifier
                    .fillMaxWidth()
                    .height(54.dp)
                    .background(Color.Red)
            )
            AnimatedVisibility(expanded) {
                Box(
                    Modifier
                        .fillMaxWidth()
                        .padding(start = 10.dp)
                        .heightIn(56.dp, 300.dp)
                        .background(Color.Green)
                )
            }
        }
    }
}

enter image description here

Android相关问答推荐

以正确的方式从房间收集流量

derivedStateOf与使用key和MutableState记住

替换- prop -中的值(adb shell getprop)

Android在NavHost中的LazyColumn中编写约束布局:error - replace()在未放置的项目上调用

Android写/读二进制文件到共享存储

使用 List 和 LazyColumn 重新组合所有项目

retrofit2.HttpException: HTTP 401

当 Firebase Firestore 发生变化时,Kotlin ViewModel 不会更新

[Android][Room] 将密封类存储到 Room 数据库中

如何知道我的应用程序的新版本是否显示广告?

使用 Kotlin 在 Android 中导航时如何防止 ViewModel 被杀死?

如何绘制内边框?

无法找到方法 ''java.io.File > org.jetbrains.kotlin.gradle.tasks.KotlinCompile.getDestinationDir()

Android工作室未成立

可组合的可见性不随状态变化而变化

状态值更改时屏幕未重新组合 - Jetpack Compose

无法使用 Gradle 托管设备对基线配置文件运行测试

Jetpack Compose:如何绘制这样的路径/线

在 Compose 中使用 DeepLink 会导致无法向后导航

Android Studio,Db 连接错误:发生异常情况导致驱动程序失败.请报告此异常