是否可以在 RecyclerView Adapter 或 Dialog 中使用 MVVM ViewModel?

Is it possible using MVVM ViewModel in RecyclerView Adapter or Dialog?

我正在制作一个功能,当我触摸 recyclerView 项目时会打开一个对话框。我将 viewModel 放在适配器中,将 onClick 函数放在 viewHolder 中,以使用 viewModel 打开对话框。

看起来像这样。

Adapter(viewModel) // Initialize adapter in Activity or ViewModel

class Adapter(viewModel: ViewModel) : ViewModel() {
    inner class ViewHolder() {
        fun onClick(binding: RecyclerViewItemBinding) : RecyclerView.ViewHolder(binding.root) {
            Dialog(viewModel) // Open Dialog with viewModel
        }
    }
}

我可以在适配器或对话框中使用 ViewModel 吗?如果不能,我该怎么办?我需要通过从对话框接收更改后的值来更改 ViewModel 的数据。

ViewModels 应限制为 activities/fragments,避免将其传递到您喜欢的任何地方。使用 liveData 传递事件,例如将适配器中可拦截的点击事件传递给 viewModel 附加到的 activity/fragment。还可以使用 liveData 通知您的适配器有关 viewModel 内部发生的数据更改。我已经创建了一个反映您期望结果的简单项目,请看一下:

https://github.com/phamtdat/ViewModelForAdapterDemo

要点:

  1. 数据仅在 viewModel 中处理
  2. 使用 liveData 通知数据变化
  3. 根据数据更改更新适配器
  4. 拦截viewHolder中的点击事件,转发给adapter
  5. 将点击事件从适配器转发到 viewModel 附加到的 activity
  6. 在点击事件时显示带有相应数据的对话框
  7. 更改对话逻辑中的数据
  8. 结果应该是:更新的 recyclerView 显示新数据

这样你就可以清楚地分离关注点: viewModel - 只处理数据 activity - 仅处理 UI 事件(在我们的例子中是项目的点击事件和显示对话框) 适配器 - 仅处理项目 UIs

的正确呈现

为简单起见,我没有使用dataBinding,但如果我有时间当然会,这样你就不必更新viewHolder中的UI,只需将模型传递给绑定。