ArrayList 的实时数据未观察(Kotlin)?

Live Data with ArrayList not observing (Kotlin)?

我在我的项目中使用 Android Jetpack Component ViewModel + Live data 之一,它在使用普通数据(例如 string 和 Int)时对我来说工作正常,但是当涉及到 arrayList 时,它不会观察到任何东西

这是我的代码

class MainActivityModel : ViewModel() {

    private var dataObservable = MutableLiveData<ArrayList<Int>>()

    init {
        dataObservable.value = arrayListOf(1,2,3,4,5)
    }

    fun getInt(): LiveData<ArrayList<Int>> = dataObservable

    fun addInt(i:Int) {
        dataObservable.value!![i] = dataObservable.value!![i].plus(1)
    }
}

LiveData 不会向观察者广播更新,除非它的值完全重新分配了一个新值。这不会重新分配值:

dataObservable.value!![i] = dataObservable.value!![i].plus(1)

它的作用是保留现有数组,但添加一个数组元素。 LiveData 不会通知它的可观察对象。必须重新分配实际的数组对象。

如果你想重新分配一个新的数组值并通知所有观察者,一共重新分配一个新数组,像这样:

dataObservable.value = dataObservable.value!![i].plus(1)

分配 dataObservable.value 将调用 LiveData setValue() 方法,并通知观察者传递给 setValue() 的新值。

如果您在主线程之外修改您的复杂可观察对象,您需要使用 postValue

       dataObservable?.value[i] += 1 
       dataObservable.apply { 
                postValue(value)
       }