2

我有一个关于 LiveData 的非常简单的问题。我有一个MutableLiveData<MutableList<Car>>并且我想更新列表中的特定字段,所以我猜当该字段更新时, MutableLiveData 应该触发观察者,但这不会发生。

所以如果我使用这行代码,我的观察者不会被触发。

var carList = MutableLiveData<MutableList<Car>>()
...
carList.value?.set(car.id,Car(car.id, color)) 

但是如果我做这样的事情,观察者就会被触发。

var carList = MutableLiveData<MutableList<Car>>()
...
var newList = carList.value
carList?.set(car.id,Car(car.id, color))
carList.value = newList 

有人可以解释为什么会这样吗?是否必须为要触发的 livedata 提供一个全新的列表,或者我缺少什么?先感谢您。

4

1 回答 1

2

如果您MutableList为包装值分配一个新值,MutableLiveData那么它将通知其观察者,但如果您添加/删除其包装值的任何项目,它将不会通知其观察者,因为包装值具有相同的MutableList对象引用。因此,您的第二个案例是通知您的第一个案例未通知的地方。您可以通过以下扩展来克服此问题MutableLiveData

fun <T> MutableLiveData<MutableList<T>>.addNewItem(item: T) {
    val oldValue = this.value ?: mutableListOf()
    oldValue.add(item)
    this.value = oldValue
}

fun <T> MutableLiveData<MutableList<T>>.addNewItemAt(index: Int, item: T) {
    val oldValue = this.value ?: mutableListOf()
    oldValue.add(index, item)
    this.value = oldValue
}

fun <T> MutableLiveData<MutableList<T>>.removeItemAt(index: Int) {
    if (!this.value.isNullOrEmpty()) {
        val oldValue = this.value
        oldValue?.removeAt(index)
        this.value = oldValue
    } else {
        this.value = mutableListOf()
    }
}

然后添加/删除您MutableLiveData喜欢的项目:

// Here is your car list
var carList = MutableLiveData<MutableList<Car>>()

// Add new item to your car list
carList.addNewItem(Car(car.id, color))

// Delete an item from car list at position i
carList.removeItemAt(i)

// Add new item to your car list at position i
carList.addNewItemAt(i, Car(car.id, color))
于 2020-05-16T10:06:25.293 回答