Android LiveData 实现列表勾选

更新日期: 2023-07-19 阅读次数: 466 字数: 352 分类: Android

界面功能

界面功能是禁忌症确认,只有不存在任何一项的时候,才能进入使用。

每一项是一个 Switch 按钮,代表是否勾选。

记录目的

感觉我对 LiveData 的理解还是不够充分。也许经历越多的实战,才能理解更多吧。

修改其中一个 item 的 field

class ViewHolder(private val binding: ConfirmRowItemBinding) :
	RecyclerView.ViewHolder(binding.root) {

	fun bind(item: ConfirmationItem) {
		binding.name.text = item.title
		binding.switchOne.isChecked = item.isSelected
		binding.switchOne.setOnCheckedChangeListener { _, isChecked ->
			item.isSelected = isChecked
		}
	}
}

在 adapter 中,监听 switch 的切换,并赋值给 list item。

实际上读取 live data 的 value 就能查询到最新状态了。

全量修改

binding.switchAll.setOnCheckedChangeListener { _, isChecked ->
	val items = viewModel.items.value
	items?.let { items ->
		for (item in items) {
			item.isSelected = isChecked
		}
	}
	diseaseViewModel.items.postValue(items)
	adapter.notifyDataSetChanged()
}

虽然 Android Studio 中提示:

It will always be more efficient to use more specific change events if you can. Rely on notifyDataSetChanged as a last resort.

但是这里,不用 notifyDataSetChanged 不行。

DiffUtil 为何没有生效

使用 DiffUtil 就是为了避免使用 recyclerview 的 adapter 的 notifyDataSetChanged(),因为当可能只有几件事情发生变化时,它重新绘制整个UI是不高效的。

但是为何没有生效,我毫无头绪。。。

关于 RecyclerView 的数据更新,主要有以下几个方法

  • notifyDataSetChanged(),刷新全部可见的item。
  • notifyItemChanged(int),刷新指定item。
  • notifyItemRangeChanged(int,int),从指定位置开始刷新指定个item。
  • notifyItemInserted(int)、notifyItemMoved(int)、notifyItemRemoved(int)。插入、移动一个并自动刷新。
  • notifyItemChanged(int, Object),局部刷新。

为何监听 LiveData 监测不到 field 变化

但是之前写的蓝牙扫描功能,就能实现显示信号强弱。

tags: LiveData

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式