kotlin 不更新回收站中的项目的差异

jucafojl  于 2023-11-21  发布在  Kotlin
关注(0)|答案(1)|浏览(180)

我在将数据更新到回收器视图时遇到问题。

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()
        }
    }


在片段中,我将列表更新为TE recycler

viewModel.sectorItem.observe(viewLifecycleOwner) {
      homeSectorAdapter.submitList(it)
}


但是由于某些原因,回收器中的数据没有更新。
如果我创建了新的数据示例,回收器会正确地更新数据。但是我知道这不是一个好的做法,所以我不想这样做。

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)
        }
    }

q8l4jmvw

q8l4jmvw1#

你的代码看起来不错,可能是适配器中的update方法。
试试这样的东西:

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)。

相关问题