Android Kotlin 批量切换ListAdapter所有条目内视图显隐失效求解
问题原因
一共有3处核心错误导致功能失效:
hideSwitches方法逻辑错误:你写的!newTask.showSwitch只是计算了布尔值取反,没有实际给新Task对象的showSwitch属性赋值;同时showSwitch没有定义在Task的主构造函数中,data class默认的copy方法不会复制类体内定义的属性值,导致新copy出的对象showSwitch始终是默认值true。reset方法没有触发重绘:你直接修改了原有currentList里的对象属性,没有提交新列表触发DiffUtil校验和条目重绘。- 视图设置逻辑冗余: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
相关产品推荐
相关产品推荐

