【问题标题】:How to set the properties in a RecyclerView to update when the ViewModel List items properties are updated?当 ViewModel 列表项属性更新时,如何设置 RecyclerView 中的属性以更新?
【发布时间】:2019-09-10 18:39:45
【问题描述】:

我以这样一种方式设置我的项目,即 RecyclerView 从 ViewModel 加载项目列表,然后显示它们。因此,ViewModel 存储了一个 LiveData>,RecyclerView 观察并应该在它发生变化时进行更新。

这适用于我想在列表中删除或添加元素的情况,但如果我想更新列表元素的文本属性怎么办?由于这不被视为修改列表,因此不会触发观察者。

基本上有办法解决这个问题。我在想也许可以在发生更改时从 ViewModel 手动触发 Observer,但这种方式似乎与 ViewModel 的整个原理背道而驰。

一些基本的上下文代码

MainFragment.kt:

mViewModel.allItems.observe(activity!!, Observer { newData ->
    adapter.data = newData
})

MainAdapter.kt:

var data = listOf<Item>()
    set(value) {
        field = value
        notifyDataSetChanged()
    }

MyViewModel.kt:

private val _allItems = MutableLiveData<List<Item>>()
    val allItems: LiveData<List<Item>>
        get() = _allItems

我希望在 ViewModel 中运行时更新 RecyclerView:

fun updateItem(arg : String) {
    for (item in _allItems.value!!) {
        if (item.text == arg) {
            item.text = "$arg: clicked!"
        }
    }
}

【问题讨论】:

  • 您是否尝试仅重置 LiveData 的值? _allItems.postValue(_allItems.value)更新列表内的项目后
  • 做到了!我正在寻找一个可以做到这一点的功能。我一定是在文档中错过了它。
  • 太好了,将作为答案发布。如果您能接受,将不胜感激。

标签: kotlin android-recyclerview android-livedata


【解决方案1】:

尝试重置 LiveData 的值:

_allItems.postValue(_allItems.value)

更新列表中的项目后

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-02
    • 2020-02-21
    • 2015-05-26
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多