kotlin 如何在Jetpack合成中点击卡片时更改卡片的边框颜色?

cwdobuhd  于 2022-11-25  发布在  Kotlin
关注(0)|答案(2)|浏览(190)

我有一个用户列表,它显示在一个懒惰的行中。每行由一张卡片表示。每张卡片都有一个红色的边框。我如何在单击卡片时将卡片的边框从红色更改为黑色?
以下是我的尝试:

LazyRow(
    modifier = Modifier.fillMaxWidth()
) {
    items(users) { user ->
        UserCard(
            name = user.name
        )
    }
}

这是一张卡片:

fun UserCard(
    name: String
) {
    Card(
        modifier = Modifier.fillMaxWidth()
        border = BorderStroke(2.dp, Color.Red),
        onClick = { ??? }
    ) {
        Text(
            text = name
        )
    }
}
vuv7lop3

vuv7lop31#

如果你想有一个有状态的组合,你可以通过将颜色存储在一个带有MutableState的记忆中,并在点击时改变它。但是,当你滚动回同一个项目时,这将重置,因为当它再次出现在屏幕上时,它将被重新组合,并具有不推荐的状态。

fun UserCard(
    name: String
) {

    var color by remember {mutableStateOf(Color.Red)}
    Card(
        modifier = Modifier.fillMaxWidth()
        border = BorderStroke(2.dp, color),
        onClick = { color = Color.Black}
    ) {
        Text(
            text = name
        )
    }
}

如果你想拥有无状态的可组合,你可以通过状态提升来实现。与上面的一个不同,当新的项目将被重新组合时,即使你向下滚动并返回,这个项目也将具有相同的颜色,将使用现有的边框颜色

data class User(val name: String, var color: Color = Color.Red)

@Composable
private fun BorderList() {
    val userList = remember {
        mutableStateListOf<User>().apply {
            repeat(100) {
                add(User("User $it"))
            }
        }
    }

    LazyColumn {
        itemsIndexed(userList) { index, user ->
            UserCard(name = user.name, borderColor = user.color) {

                val newColor = if(user.color == Color.Red) Color.Black else Color.Red
                userList[index] = user.copy(color = newColor)
            }
        }
    }
}

@Composable
fun UserCard(
    name: String,
    borderColor: Color,
    onColorChange: () -> Unit
) {
    Card(
        modifier = Modifier.fillMaxWidth(),
        border = BorderStroke(2.dp, borderColor),
        onClick = { onColorChange() }
    ) {
        Text(
            text = name
        )
    }
}
83qze16e

83qze16e2#

您可以使用类似于以下内容的内容:

var cardColor by remember { mutableStateOf(Red)}

Card(
    //..
    border = BorderStroke(2.dp, cardColor),
    onClick = { cardColor = Blue }
) {
    Text(
        text = "name"
    )
}

如果要处理选定的状态,可以使用类似以下的语句:

var selectedCard by remember { mutableStateOf(false) }
var cardColor = if (selectedCard) Red else Black

Card(
    border = BorderStroke(2.dp, cardColor),
    onClick = { selectedCard = !selectedCard }
) {
    Text(
        text = "name"
    )
}

相关问题