Diff util 不更新回收器中的项目

问题描述 投票:0回答:1

我在将数据更新到回收者视图时遇到问题。我正在使用带有 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)
        }
    }
android kotlin android-recyclerview mutablelivedata android-diffutils
1个回答
0
投票

您的代码似乎不错,也许在适配器中的更新方法中。

尝试这样的事情:

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完全更新)。

© www.soinside.com 2019 - 2024. All rights reserved.