【问题标题】:Update MutableList of MutableLiveData更新 MutableLiveData 的 MutableList
【发布时间】:2021-02-09 08:37:30
【问题描述】:

我有一个像这样的数据类:

data class Item(
    val name: String,
    val price: Int = 0
)

还有一个 ViewModel,例如:

class MyViewModel(app: Application) : AndroidViewModel(app) {
    private val _items = MutableLiveData<MutableList<Item>>()
    val items: LiveData<MutableList<Item>>
        get() = _items

    init {
        _items.value = mutableListOf()
    }

    fun addItem(){
         _items.value?.add(Item(name="newitem", price=10))
         _items.value = _items.value
    }
}

addItem()被调用后,_itemsitems添加了新的item,可以通过Log.d()确认。但是,UI 没有反映更改,我该如何解决这个问题?

一种可行的方法是使用MutableLiveData&lt;List&lt;Item&gt;&gt; 而不是MutableLiveData&lt;MutableList&lt;Item&gt;&gt;,使用_items.value = _items.value?.plus(arrayListOf(newItem))。但是,这样我就无法更新添加项目的单个属性,例如price

【问题讨论】:

  • 您使用的是什么 UI 元素以及它是如何观察到这一点的。它是一个 ListAdapter 吗?
  • 尝试 _items.notifyObserver() 通知所有观察者。
  • MutableLiveData&lt;MutableList&lt;T&gt;&gt;换成MutableLiveData&lt;List&lt;T&gt;&gt;,你的所有问题都会迎刃而解

标签: android kotlin android-livedata android-jetpack mutablelivedata


【解决方案1】:

创建一个临时的 mutableList,在临时列表中添加新项目,然后将 _items 更新为:_items.value = temp。这样,我们就改变了 mutableLiveData 的引用,触发了更新

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多