如何从我的视图模型中更新元素的回收视图?
How can I update a recycler view of elements from my view model?
如何从我的视图模型更新元素的回收器视图?
视图模型
class HandlerViewModel(application: Application): AndroidViewModel(application) {
fun update(data: Data, isActive: Boolean) {
// calls a helper function that calls the backend then returns true or false.
val result: Boolean = callBackend(data, isActive)
}
}
因此,当用户在回收站视图中单击某个项目时,我将调用此 update()
函数。然后我想根据从后端获得的结果更改列表中项目的颜色。我应该如何使用 LiveData
来做到这一点?
通常情况下,如果它只是一个静态元素,我可以很容易地做到这一点,但如果这是一个大小为 n 的回收视图,那么我如何 link 它到 LiveData?
如果您不使用数据绑定,您可以尝试类似的方法。在数据对象中创建一个新字段,表示替代颜色的布尔值。因此,在您的适配器中,您可以在 onBind
:
中执行此操作
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
val data = adapterList[position]
if(data.otherColor) {
viewholder.textView.color = Color.Red
} else {
viewholder.textView.color = Color.Black
}
}
然后:
// inside your viewModel
private val _singleData = MutableLiveData<Data>()
val singleData: LiveData<Data>
get() = _singleData
fun update(data: Data, isActive: Boolean) {
val result: Boolean = callBackend(data, isActive)
data.otherColor = result
_singleData.value = data
}
// inside your activity
handlerViewModel.singleData.observe(this, Observer { singleData ->
val index = adapter.adapterList.indexOfFirst { singleData.id == it.id }
adapterList[index] = singleData
adapter.notifyItemChanged(index)
}
或者如果您想观察和更新整个数据集:
// inside your viewModel
private val _allData = MutableLiveData<List<Data>>()
val allData: LiveData<List<Data>>
get() = _allData
fun update(data: Data, isActive: Boolean) {
val result: Boolean = callBackend(data, isActive)
val listToUpdate = allData.value
listToUpdate.find { it.id == data.id }.otherColor = result
_allData.value = listToUpdate
}
// inside your activity
handlerViewModel.allData.observe(this, Observer { rvData ->
adapter.clear()
adapter.addAll(rvData)
adapter.notifydatasetChanged()
}
如何从我的视图模型更新元素的回收器视图?
视图模型
class HandlerViewModel(application: Application): AndroidViewModel(application) {
fun update(data: Data, isActive: Boolean) {
// calls a helper function that calls the backend then returns true or false.
val result: Boolean = callBackend(data, isActive)
}
}
因此,当用户在回收站视图中单击某个项目时,我将调用此 update()
函数。然后我想根据从后端获得的结果更改列表中项目的颜色。我应该如何使用 LiveData
来做到这一点?
通常情况下,如果它只是一个静态元素,我可以很容易地做到这一点,但如果这是一个大小为 n 的回收视图,那么我如何 link 它到 LiveData?
如果您不使用数据绑定,您可以尝试类似的方法。在数据对象中创建一个新字段,表示替代颜色的布尔值。因此,在您的适配器中,您可以在 onBind
:
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
val data = adapterList[position]
if(data.otherColor) {
viewholder.textView.color = Color.Red
} else {
viewholder.textView.color = Color.Black
}
}
然后:
// inside your viewModel
private val _singleData = MutableLiveData<Data>()
val singleData: LiveData<Data>
get() = _singleData
fun update(data: Data, isActive: Boolean) {
val result: Boolean = callBackend(data, isActive)
data.otherColor = result
_singleData.value = data
}
// inside your activity
handlerViewModel.singleData.observe(this, Observer { singleData ->
val index = adapter.adapterList.indexOfFirst { singleData.id == it.id }
adapterList[index] = singleData
adapter.notifyItemChanged(index)
}
或者如果您想观察和更新整个数据集:
// inside your viewModel
private val _allData = MutableLiveData<List<Data>>()
val allData: LiveData<List<Data>>
get() = _allData
fun update(data: Data, isActive: Boolean) {
val result: Boolean = callBackend(data, isActive)
val listToUpdate = allData.value
listToUpdate.find { it.id == data.id }.otherColor = result
_allData.value = listToUpdate
}
// inside your activity
handlerViewModel.allData.observe(this, Observer { rvData ->
adapter.clear()
adapter.addAll(rvData)
adapter.notifydatasetChanged()
}