【问题标题】:How can I update a recycler view of elements from my view model?如何从我的视图模型更新元素的回收器视图?
【发布时间】:2020-04-09 23:31:28
【问题描述】:

如何从我的视图模型更新元素的回收器视图?

视图模型

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 的回收器视图,那么我如何将它链接到 LiveData?

【问题讨论】:

    标签: android kotlin mvvm android-recyclerview viewmodel


    【解决方案1】:

    如果您不使用数据绑定,您可以尝试这样的方法。在数据对象中创建一个新字段,表示替代颜色的布尔值。因此,在您的适配器中,您可以在 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()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多