android LazyColumn单选状态提升. Jetpack组合

xuo3flqw  于 2022-11-20  发布在  Android
关注(0)|答案(1)|浏览(141)

我有一个带有可展开项的LazyColumn。当我单击该项时,它会展开或折叠,但是我需要当我点击关闭的元素时,它会打开,列表中的其他元素会关闭。所以首先我把item的状态从item的组合函数中的remember变量移到dataClass元素列表中。当我点击item时,它会执行回调来改变它的值。选择列表中的元素,但不重新组合。
第一个

yqyhoc1h

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)
                )
            }
        }
    }
}

相关问题