如何向MutableLiveData中的List添加数据?

3
我想在ViewModel中的MutableLiveData List中添加一个项目。
由于使用listOf()进行初始化,所以List是只读的。
但在某些情况下,我需要添加一个项目。
为此,我使用toMutableList() 进行类型转换,但在调试的结果中,LiveData的List没有变化。
如何将数据应用到LiveData List中?
class WriteRoutineViewModel : ViewModel() {
    private var _items: MutableLiveData<List<RoutineModel>> = MutableLiveData(listOf())

    val items: LiveData<List<RoutineModel>> = _items

    fun addRoutine(workout: String) {
        val item = RoutineModel(workout, "TEST")
        _items.value?.toMutableList()?.add(item) // nothing change
    }
}

1
_items.value = _items.value?.toMutableList()?.apply{ add(item) } - 取出当前列表,创建一个新的可变列表,添加您的项目并将其分配给值。目前,您正在更改 MutableLiveData 中相同的 value,这不会触发新的事件给观察者(它只是底层的观察者模式)。 - Mark
2
_items.value?.let { _items.value = it + item } - IR42
1个回答

12

_items.value?.toMutableList() 创建了一个新的列表实例,因此你没有往 LiveData 的列表中添加元素。

即使你设法向 LiveData 中的实际列表对象添加元素(通过某些脏的强制转换),它可能也不会触发 LiveData 中的更改事件,因此订阅者将不会被通知新值。

你想要的是实际上将一个新列表分配给 MutableLiveData

_items.value = _items.value?.plus(item) ?: listOf(item)
如果 LiveData 中当前列表为 null,则会分配一个仅包含新项的新列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接