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

Ove*_*asy 1 data-binding android mvvm viewmodel android-recyclerview

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

\n

看起来像这样。

\n

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

\n

\xe2\x86\x93

\n
class Adapter(viewModel: ViewModel) : ViewModel() {\n    inner class ViewHolder() {\n        fun onClick(binding: RecyclerViewItemBinding) : RecyclerView.ViewHolder(binding.root) {\n            Dialog(viewModel) // Open Dialog with viewModel\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

Dat*_*Tat 6

ViewModel 应仅限于活动/片段,避免将其传递到您喜欢的任何地方。使用 liveData 传递事件,例如将适配器中可拦截的单击事件传递到 viewModel 所附加到的活动/片段。还可以使用 liveData 通知适配器有关 viewModel 内部发生的数据更改。我创建了一个简单的项目来反映您想要的结果,请看一下:

https://github.com/phamtdat/ViewModelForAdapterDemo

关键点:

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

这样你就可以清楚地分离关注点:viewModel - 仅处理数据活动 - 仅处理 UI 事件(在我们的例子中为项目的单击事件并显示对话框)适配器 - 仅处理项目 UI 的正确呈现

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