如何设置 RecyclerView 中的属性以在更新 ViewModel 列表项属性时更新?
How to set the properties in a RecyclerView to update when the ViewModel List items properties are updated?
我以 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)
更新列表中的项目后
我以 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)
更新列表中的项目后