是否可以在 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
要点:
- 数据仅在 viewModel 中处理
- 使用 liveData 通知数据变化
- 根据数据更改更新适配器
- 拦截viewHolder中的点击事件,转发给adapter
- 将点击事件从适配器转发到 viewModel 附加到的 activity
- 在点击事件时显示带有相应数据的对话框
- 更改对话逻辑中的数据
- 结果应该是:更新的 recyclerView 显示新数据
这样你就可以清楚地分离关注点:
viewModel - 只处理数据
activity - 仅处理 UI 事件(在我们的例子中是项目的点击事件和显示对话框)
适配器 - 仅处理项目 UIs
的正确呈现
为简单起见,我没有使用dataBinding,但如果我有时间当然会,这样你就不必更新viewHolder中的UI,只需将模型传递给绑定。
我正在制作一个功能,当我触摸 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
要点:
- 数据仅在 viewModel 中处理
- 使用 liveData 通知数据变化
- 根据数据更改更新适配器
- 拦截viewHolder中的点击事件,转发给adapter
- 将点击事件从适配器转发到 viewModel 附加到的 activity
- 在点击事件时显示带有相应数据的对话框
- 更改对话逻辑中的数据
- 结果应该是:更新的 recyclerView 显示新数据
这样你就可以清楚地分离关注点: viewModel - 只处理数据 activity - 仅处理 UI 事件(在我们的例子中是项目的点击事件和显示对话框) 适配器 - 仅处理项目 UIs
的正确呈现为简单起见,我没有使用dataBinding,但如果我有时间当然会,这样你就不必更新viewHolder中的UI,只需将模型传递给绑定。