Max*_*ann 11 android android-jetpack android-jetpack-compose android-jetpack-compose-list
我想选择 LazyColumn 的一项并更改文本颜色。如何识别选择了哪个项目?
代码:
val items = listOf(Pair("A", 1), Pair("AA", 144), Pair("BA", 99))
var selectedItem by mutableStateOf(items[0])
LazyColumn {
this.items(items = items) {
Row(modifier = Modifier.clickable(onClick = {selectedItem = it}) {
if (selectedItem == it) {
Text(it.first, color = Color.Red)
} else {
Text(it.first)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
根据我保存它的方式(记住或不记住),如果我单击一个而不只是我最后单击的一个,它们只会突出显示。
Gab*_*tti 20
您可以使用修饰符.selectable代替.clickable
就像是:
data class Message(val id: Int,
val message : String)
val messages : List<Message> = listOf(...))
val listState = rememberLazyListState()
var selectedIndex by remember{mutableStateOf(-1)}
LazyColumn(state = listState) {
items(items = messages) { message ->
Text(
text = message.message,
modifier = Modifier
.fillMaxWidth()
.background(
if (message.id == selectedIndex)
Color.Red else Color.Yellow
)
.selectable(
selected = message.id == selectedIndex,
onClick = { if (selectedIndex != message.id)
selectedIndex = message.id else selectedIndex = -1})
)
}
}
Run Code Online (Sandbox Code Playgroud)
根据您的情况,您可以使用:
var selectedItem by remember{mutableStateOf( "")}
LazyColumn {
this.items(items = items) {
Row(modifier = Modifier.selectable(
selected = selectedItem == it.first,
onClick = { selectedItem = it.first}
)
) {
if (selectedItem == it.first) {
Text(it.first, color = Color.Red)
} else {
Text(it.first)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
msa*_*sha 13
请注意,在接受的答案中,每次选择更改时,所有项目视图都将重新组合,因为传入的 lambdaonClick和content(of Row) 不稳定(https://developer.android.com/jetpack/compose/lifecycle#skipping)。
这是一种方法,以便仅重新组合取消选择和选择的项目:
@Composable
fun ItemView(index: Int, selected: Boolean, onClick: (Int) -> Unit){
Text(
text = "Item $index",
modifier = Modifier
.clickable {
onClick.invoke(index)
}
.background(if (selected) MaterialTheme.colors.secondary else Color.Transparent)
.fillMaxWidth()
.padding(12.dp)
)
}
@Composable
fun LazyColumnWithSelection(){
var selectedIndex by remember { mutableStateOf(0) }
val onItemClick = { index: Int -> selectedIndex = index}
LazyColumn(
modifier = Modifier.fillMaxSize(),
){
items(100){ index ->
ItemView(
index = index,
selected = selectedIndex == index,
onClick = onItemClick
)
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意传递的参数如何ItemView仅针对选定状态发生更改的项目进行更改。这是因为onItemClicklambda 始终相同。
| 归档时间: |
|
| 查看次数: |
22768 次 |
| 最近记录: |