android - Jetpack 撰写 : LazyColumn not updating with MutableList

标签 android android-jetpack-compose lazycolumn mutablelist compose-recomposition

我正在尝试使用 Jetpack Compose 在单击按钮时删除文本,但 UI 未更新

我尝试设置一个按钮,然后单击一个按钮,deletedTasks 得到更新,如果我的任务在 deletedTasks 中,那么它应该显示一个删除线.

此更改仅手动发生,但我希望它是自动的

我不知道该怎么做。这是我第一次尝试 Jetpack Compose,我们将不胜感激

@Composable
fun toDoItem(title: String, category: String, task: Task) {

    val rememberTask = remember { mutableStateOf(deletedTasks) }

    Surface(...) {

        Column (...) {

            Row {
                Column (...) {
                    if (!deletedTasks.contains(task)){
                        Text(text = title, style = MaterialTheme.typography.h4.copy(
                            fontWeight = FontWeight.Bold
                        ))
                    } else {
                        Text(text = title, style = MaterialTheme.typography.h4.copy(
                            fontWeight = FontWeight.Bold
                        ), textDecoration = TextDecoration.LineThrough)
                    }
                }
                IconButton(onClick = {
                    rememberTask.value.add(task)
                }) {
                    Icon(imageVector = Icons.Filled.Check, contentDescription =  "Check")
                }
            }
        }
    }
}

@Composable
fun recyclerView(tasks: MutableList<Task>) {
    LazyColumn (modifier =  Modifier.padding(vertical = 10.dp, horizontal = 80.dp)) {
        items(items = tasks) {task ->
            toDoItem(task.title, task.category, task)
        }
    }

}

最佳答案

您正在使用 MutableList<> ,不建议将其用于 Jetpack Compose 中的任何集合用例.我建议将其更改为 SnapshotStateList .

您的 recyclerView 可组合项看起来像这样

@Composable
fun recyclerView(tasks: SnapshotStateList<Task>) { ... }

在你设置东西的地方(例如 ViewModel )就像

tasks = mutableStateListOf<Task>( ... )

使用 SnapshotStateList将保证“更新”或re-composition使用您对它执行的任何正常列表操作,例如,

  • list.add( <new task> )
  • list.remove( <selected task> )
  • list[index] = task.copy() <- 更新列表的惯用方式

还有SnapshotStateMap这是Map key~value对用例。

但是如果您对如何更新 LazyColumn 感到好奇用普通的List ,您将不得不重新创建整个 MutableList<Task>这样它将通知 Composer 进行了更新,因为 MutableList<Task>现在指的是任务集合的新引用。

关于android - Jetpack 撰写 : LazyColumn not updating with MutableList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74134219/

相关文章:

java - 在 Android Studio 中安装并集成 Apache OpenNLP

android - Android 中 HttpURLConnection 中的方法 getInputStream() 总是失败

android - 如何仅选择列表中的一项(LazyColumn)?

c# - 如何在 Android 中使用信号器

Android 在点击时删除通知(由 mNotifyBuilder 创建)

android - 垂直居中 BottomSheet 的内容,无论其状态如何 [完全展开或半展开]

android - 如何在单击按钮时更改按钮背景颜色

android - 如何在 Jetpack Compose 的 TextField 中正确设置高度?

android - LazyColumn 项目,隐式接收器无法在此上下文中调用单元