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

Android Kotlin 批量切换ListAdapter所有条目内视图显隐失效求解

问题原因

一共有3处核心错误导致功能失效:

  1. hideSwitches方法逻辑错误:你写的!newTask.showSwitch只是计算了布尔值取反,没有实际给新Task对象的showSwitch属性赋值;同时showSwitch没有定义在Task的主构造函数中,data class默认的copy方法不会复制类体内定义的属性值,导致新copy出的对象showSwitch始终是默认值true。
  2. reset方法没有触发重绘:你直接修改了原有currentList里的对象属性,没有提交新列表触发DiffUtil校验和条目重绘。
  3. 视图设置逻辑冗余:bind方法中先在addTaskItemProperties里把switch强制设为可见,后续再做隐藏判断,虽然功能不冲突但会产生不必要的属性赋值。

修复方案

1. 调整Task实体类结构

把showSwitch放到主构造函数中,确保data class的copy方法可以正确复制该属性:

@Entity
data class Task(
    // 原有主构造参数保持不变
    var showSwitch: Boolean = true
) : Serializable {
    // 原有其他类内逻辑保持不变
}

2. 修复Adapter的hideSwitches方法

正确赋值新对象的showSwitch属性:

fun hideSwitches() {
    val newList = currentList.map { task ->
        task.copy(showSwitch = false)
    }
    submitList(newList)
}

3. 修复Adapter的reset方法

修改属性后提交新列表触发重绘:

fun reset() {
    val newList = currentList.map { task ->
        val newTask = task.copy(showSwitch = true)
        newTask.resetTaskSelection()
        newTask
    }
    submitList(newList)
}

4. (可选)优化视图设置逻辑

合并switch显隐判断到初始化方法,减少冗余代码:

private fun addTaskItemProperties(task: Task) {
    binding.itemTaskName.text = task.taskName
    binding.itemTaskTime.text = task.taskMinutes.convertMinutesToHour()
    // 直接根据属性设置可见性,不需要后续重复修改
    binding.timerSwitch.visibility = if (task.showSwitch) View.VISIBLE else View.GONE
    binding.root.setCardBackgroundColor(cardColorDefault)
    configureCheckItem()
}

修改后可以删除bind方法中单独的if (!task.showSwitch) { binding.timerSwitch.visibility = View.GONE }代码块。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:15:03