【问题标题】:Is it possible using MVVM ViewModel in RecyclerView Adapter or Dialog?是否可以在 RecyclerView 适配器或对话框中使用 MVVM ViewModel?
【发布时间】:2021-03-23 03:42:11
【问题描述】:

我正在制作一个功能,当我触摸 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 吗?如果不能,我该怎么办?我需要通过从 Dialog 接收更改的值来更改 ViewModel 的数据。

【问题讨论】:

    标签: android mvvm android-recyclerview data-binding viewmodel


    【解决方案1】:

    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,只需将模型传递给绑定。

    【讨论】:

    • 抱歉迟到了...花了很长时间才理解您在 github 中的代码。但它帮助解决了我的问题。说真的,非常感谢!
    • 关注点分离是有意义的。但是,您使用从适配器到活动的实时数据以及从视图持有者到适配器的回调的原因是什么?我很可能只会从适配器回调到活动。
    猜你喜欢
    • 2019-09-29
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多