问题:::我想创建一个惰性列,在其中一次只能选择或取消选择一个选项。现在,每当我单击惰性列中的行组件时,所有行都将被选中。
代码:
@Composable
fun LazyColumnWithSelection() {
var isSelected by remember {
mutableStateOf(false)
}
var selectedIndex by remember { mutableStateOf(0) }
val onItemClick = { index: Int -> selectedIndex = index }
LazyColumn(
modifier = Modifier.fillMaxSize(),
) {
items(100) { index ->
Row(modifier = Modifier
.fillMaxWidth()
.clickable {
onItemClick.invoke(index)
if (selectedIndex == index) {
isSelected = !isSelected
}
}
.padding(16.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically) {
Text(text = "Item $index", modifier = Modifier.padding(12.dp), color = Color.White)
if (isSelected) {
Icon(imageVector = Icons.Default.Check,
contentDescription = "Selected",
tint = Color.Green,
modifier = Modifier.size(20.dp))
}
}
}
}
}
当前结果:
点击前-〉
点击后-〉
你可以看到所有的项目都被选中,但我应该能够选择或取消选择一个项目的时间,而不是所有。
我试图使用remember state来选择,但是我想我在索引选择或者if语句中做错了什么。
2条答案
按热度按时间n3ipq98p1#
这应该能给予你领先一步。
这里有
4
组件:ItemData
State holder
Item
Composable
最后是
ItemList
(LazyColumn
)所有这些都是可复制和粘贴的,所以你可以快速运行它。代码应该足够简单,让你很容易地剖析它们,并将它们作为你自己用例的参考。
注意,我们这里使用了一个数据类,它有一个唯一的
id
属性,我们将它用作LazyColumn's
item
的key
参数。我通常使用唯一标识符实现UI集合组件,以保存UI显示/删除/回收错误项目等潜在的麻烦。
qc6wkl3g2#
记住索引而不是布尔值(isSelected)。