我有一个带有可展开项的LazyColumn。当我单击该项时,它会展开或折叠,但是我需要当我点击关闭的元素时,它会打开,列表中的其他元素会关闭。所以首先我把item的状态从item的组合函数中的remember变量移到dataClass元素列表中。当我点击item时,它会执行回调来改变它的值。选择列表中的元素,但不重新组合。第一个
yqyhoc1h1#
如果你想要一个单一的选择,你可能应该考虑在一个类中提升你的列表,并通过列表的迭代器执行所有的结构更改。
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) ) } } } }
1条答案
按热度按时间yqyhoc1h1#
如果你想要一个单一的选择,你可能应该考虑在一个类中提升你的列表,并通过列表的迭代器执行所有的结构更改。