如何在LazyColumn中 Select 多个项,并最终将选定的项添加到单独的列表中.

               GettingTags(tagsContent ={ productTags ->

                val flattenList = productTags.flatMap {
                    it.tags_list
                }
                Log.i(TAG,"Getting the flattenList $flattenList")

                LazyColumn{
                    items(flattenList){
                        ListItem(text = {Text(it) })
                        if(selectedTagItem) {
                            Icon(
                                imageVector = Icons.Default.Check,
                                contentDescription = "Selected",
                                tint = Color.Green,
                                modifier = Modifier.size(20.dp)
                            )
                        }
                    }
                }

            })

可变变量状态

var selectedTagItem by remember{
    mutableStateOf(false)
}

推荐答案

首先使用要切换的选定变量创建一个类

@Immutable
data class MyItem(val text: String, val isSelected: Boolean = false)

然后通过muableStateListOf创建一个SnapshotStateList,它包含所有项,并且可以在我们使用新实例更新任何项时触发重组,还可以添加或删除项.我使用了一个视图模型,但这不是强制的.我们可以使用索引来切换项目,或者通过过滤isSelected标志来获得所选项目

class MyViewModel : ViewModel() {

    val myItems = mutableStateListOf<MyItem>()
        .apply {
            repeat(15) {
                add(MyItem(text = "Item$it"))
            }
        }

    fun getSelectedItems() = myItems.filter { it.isSelected }

    fun toggleSelection(index: Int) {

        val item = myItems[index]
        val isSelected = item.isSelected

        if (isSelected) {
            myItems[index] = item.copy(isSelected = false)
        } else {
            myItems[index] = item.copy(isSelected = true)
        }
    }
}

Create LazyColumn with Key,Key确保仅重新组合更新的项,如performance document中所示

@Composable
private fun SelectableLazyListSample(myViewModel: MyViewModel) {

    val selectedItems = myViewModel.getSelectedItems().map { it.text }
    Text(text = "Selected items: $selectedItems")
    LazyColumn(
        verticalArrangement = Arrangement.spacedBy(8.dp),
        contentPadding = PaddingValues(8.dp)
    ) {
        itemsIndexed(
            myViewModel.myItems,
            key = { _, item: MyItem ->
                item.hashCode()
            }
        ) { index, item ->
            Box(
                modifier = Modifier
                    .fillMaxWidth()
                    .background(Color.Red, RoundedCornerShape(8.dp))
                    .clickable {
                        myViewModel.toggleSelection(index)
                    }
                    .padding(8.dp)
            ) {
                Text("Item $index", color = Color.White, fontSize = 20.sp)
                if (item.isSelected) {
                    Icon(
                        modifier = Modifier
                            .align(Alignment.CenterEnd)
                            .background(Color.White, CircleShape),
                        imageVector = Icons.Default.Check,
                        contentDescription = "Selected",
                        tint = Color.Green,
                    )
                }
            }
        }
    }
}

结果

enter image description here

Android相关问答推荐

Kotlin多平台向导,不兼容版本(ANP 8.2.0)ANP 8.1.2

将Android Studio插件复制到离线网络

Android,从C++调用的铁 rust 库缺少符号

添加可组合元素的列表?

是否可以附加事件处理程序,如onClick,拖动到Canvas Composable中绘制的内容,或使用drawBehind修饰符?

返回并再次打开webview时webview无法打开相机

Android v31 及更低版本中 ImageView 中的圆角

如何在 Android Studio 中为带有 Room 的 SQLite 编写需要参数的查询?

是否可以按照干净的体系 struct 将活动实例传递给视图模型

具有数据库和升级潜力的移动应用程序开发(Android)供朋友使用

如何在 Android 的 ViewModel 中使用 LiveData

如何从 firebase 实时数据库中检索最后一个值

围绕动态大小的内容包装 Jetpack Compose Row?

Material 3 中的 ModalBottomSheet 用于 compose

任务 ':app:checkReleaseDuplicateClasses' 执行失败

Android Studio电鳗:javaHome好像无效

如何在jetpack compose中创建自定义rememberState?

Android Studio:如何添加应用程序质量洞察窗口以查看 Android Studio 中的 Crashlytics 数据?

Jetpack 使用 Canvas 组成半圆

在 Android 10 (API 29) 中隐藏状态栏并在应用程序中使用其空间