You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Room数据库如何筛选isSelected为true的任务列表实现批量删除

实现方案

1. 新增Room Dao层查询/操作方法

首先在你的TaskDao接口中新增筛选选中任务、批量删除的方法,Room会自动将布尔类型的isSelected映射为整型1(true)/0(false)存储,直接按值查询即可:

@Dao
interface TaskDao {
    // 已有方法:查询所有任务
    @Query("SELECT * FROM Task")
    suspend fun getAllTasks(): List<Task>

    // 新增:筛选所有isSelected为true的任务
    @Query("SELECT * FROM Task WHERE isSelected = 1")
    suspend fun getSelectedTasks(): List<Task>

    // 新增:批量删除任务,比循环单条删除效率更高
    @Delete
    suspend fun deleteBatchTasks(tasks: List<Task>)

    // 你原有其他方法(updateTask、deleteTask等)保留即可
}

2. ViewModel层逻辑调整

直接以数据库存储的isSelected字段为唯一数据源,不需要手动维护选中任务集合,自动触发选择模式切换:

class ListTaskViewModel(private val context: Application) : AndroidViewModel(context) {

    val taskList = MutableLiveData<List<Task>>()
    val selectionMode = MutableLiveData<Boolean>(false)
    // 新增:自动筛选的选中任务列表
    val selectedTasksList = MutableLiveData<List<Task>>()

    init {
        // 监听全量任务列表变化,自动筛选选中项、更新选择模式状态
        viewModelScope.launch {
            taskList.asFlow().collect { allTasks ->
                val selectedList = allTasks.filter { it.isSelected }
                selectedTasksList.postValue(selectedList)
                selectionMode.postValue(selectedList.isNotEmpty())
            }
        }
        // 初始化时加载全量任务
        refreshScreen()
    }

    fun syncSelection(task: Task) {
        viewModelScope.launch {
            // 直接翻转任务的选中状态更新到数据库,不需要手动维护集合
            val updatedTask = task.copy(isSelected = !task.isSelected)
            DataBaseConnect.getTaskDao(context).updateTask(updatedTask)
            refreshScreen()
        }
    }

    fun deleteSelectedTasks(context: Context){
        viewModelScope.launch {
            selectedTasksList.value?.takeIf { it.isNotEmpty() }?.let { list ->
                DataBaseConnect.getTaskDao(context).deleteBatchTasks(list)
                // 删除完成自动关闭选择模式
                selectionMode.postValue(false)
                refreshScreen()
            }
        }
    }

    fun refreshScreen() {
        viewModelScope.launch {
            // 从数据库查询最新全量任务,自动触发选中列表筛选
            val allTasks = DataBaseConnect.getTaskDao(context).getAllTasks()
            taskList.postValue(allTasks)
        }
    }

    // 原有其他方法保留即可
}

3. Activity层补充缺失逻辑

你原有观察逻辑已经适配,只需要补充删除确认弹窗的实现即可:

private fun setupConfirmationDialog() {
    AlertDialog.Builder(this)
        .setTitle("确认删除")
        .setMessage("确定要删除选中的所有任务吗?该操作无法撤销。")
        .setPositiveButton("删除") { _, _ ->
            viewModel.deleteSelectedTasks(this)
        }
        .setNegativeButton("取消", null)
        .show()
}

4. 适配器补充选中状态展示

在ListTaskAdapter的onBindViewHolder方法中,根据isSelected字段切换Item的展示样式,比如勾选框显隐、背景色变化:

override fun onBindViewHolder(holder: TaskViewHolder, position: Int) {
    val task = currentList[position]
    // 切换选中样式
    holder.itemView.isSelected = task.isSelected
    holder.selectCheckbox.isVisible = task.isSelected
    // 点击触发选中状态同步
    holder.itemView.setOnClickListener {
        selectionTaskCallback.invoke(task)
    }
}

内容的提问来源于stack exchange,提问作者Lucas Moro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:27:04