我在将数据更新到回收者视图时遇到问题。我正在使用带有 diffutil 的适配器
class DiffUtilCallback : DiffUtil.ItemCallback<SectorItemDataUI>() {
override fun areItemsTheSame(oldItem: SectorItemDataUI, newItem: SectorItemDataUI): Boolean {
return oldItem.sectorId == newItem.sectorId
}
override fun areContentsTheSame(oldItem: SectorItemDataUI, newItem: SectorItemDataUI): Boolean {
return oldItem == newItem
}
}
在 viewModel 中我有 liveData
private val _sectorItem: MutableLiveData<MutableList<SectorItemDataUI>> =
MutableLiveData()
val sectorItem: LiveData<MutableList<SectorItemDataUI>> get() = _sectorItem
我有这个方法来更新值(仅温度或湿度)
private fun updateMeasurementItem(measurement: List<NetworkMeasurement>) {
val lastMeasurement = measurement.lastOrNull() ?: return
_sectorItem.value = _sectorItem.value.also {
it?.find { item -> item.temperatureSensorId == lastMeasurement.sensorId }?.temperature =
lastMeasurement.value.toString()
it?.find { item -> item.humiditySensorId == lastMeasurement.sensorId }?.humidity =
lastMeasurement.value.toString()
}
}
在片段中我将列表更新到回收器中
viewModel.sectorItem.observe(viewLifecycleOwner) {
homeSectorAdapter.submitList(it)
}
但是由于某种原因,回收器中的数据没有更新。如果我将 Log 放在 homeSectorAdapter.submitList(it) 之前,则数据会正确显示在 logcat 中
如果我创建数据的新实例,回收器会正确更新数据。但我知道这不是一个好的做法,所以我不想这样做。
private fun setupObservers() {
viewModel.sectorItem.observe(viewLifecycleOwner) { data ->
val aux: MutableList<SectorItemDataUI> = mutableListOf()
data.forEach {
aux.add(
SectorItemDataUI(
it.sectorId,
it.sectorName,
it.temperature,
it.temperatureSensorId,
it.humidity,
it.humiditySensorId
)
)
}
homeSectorAdapter.submitList(aux)
}
}
您的代码似乎不错,也许在适配器中的更新方法中。
尝试这样的事情:
fun updateList(
newItems: List<SectorItemDataUI>,
readOnly: Boolean = false,
) {
val diffResult = DiffUtil.calculateDiff(object : DiffUtil.Callback() {
override fun getOldListSize(): Int {
return [email protected]
}
override fun getNewListSize(): Int {
return newItems.size
}
override fun areItemsTheSame(
oldItemPosition: Int,
newItemPosition: Int,
): Boolean {
return ([email protected][oldItemPosition]::class == newItems[newItemPosition]::class) && ([email protected][oldItemPosition].sectorId == newItems[newItemPosition].sectorId)
}
override fun areContentsTheSame(
oldItemPosition: Int,
newItemPosition: Int,
): Boolean {
return [email protected][oldItemPosition]::class == newItems[newItemPosition]::class && [email protected][oldItemPosition] == newItems[newItemPosition]
}
})
with([email protected]) {
clear()
addAll(newItems)
}
diffResult.dispatchUpdatesTo(this)
}
clear和addAll用于完全更新模型,diffUtil用于告诉适配器视图中哪些项目必须更新(仅内容或ViewHolder完全更新)。