【问题标题】:Can I pass the ViewModel to a RecyclerView Adapter and observe a LiveData?我可以将 ViewModel 传递给 RecyclerView 适配器并观察 LiveData 吗?
【发布时间】:2018-12-23 02:29:09
【问题描述】:

我开始实现MVVM,但我不知道在我的Adapter 中使用ViewModel 是一种良好做法还是一种反模式。

举个例子,想想你将改变背景的颜色列表和图像。在这种情况下,我会观察选定的颜色并将背景颜色绑定到 UI 中显示。

但我在两个地方观察到 colorSelected:

  • Fragment中为了改变背景颜色
  • Adapter 中显示选择了哪种颜色

那么,当我将ViewModel 传递到Adapter 并观察Adapter 时,我是否正确使用MVVM

【问题讨论】:

  • 您找到解决问题的有效方法了吗?
  • 有点,但我对此并不满意,我知道如果我在这里添加没有人会提出解决方案。你有解决办法吗?

标签: android mvvm data-binding android-recyclerview


【解决方案1】:

我现在不确定这是否是一个好的模式,但是这样做有一个问题: 这样,您的适配器将绑定到您的 ViewModel,这意味着您不能在另一个屏幕上将其与其他 ViewModel 重用。另一方面,如果没有来自 recyclerView 的额外回调,工作起来会容易得多,这使得实现更容易。我想使用回调“更好”,但通过 ViewModel“更容易”(我认为 CG 应该毫无问题地处理它)

【讨论】:

  • 当您说“我现在不确定”是因为您正在寻找更好的答案?
  • 顺便谢谢
  • @AndroidStorm 我也在寻找答案,但主要原因是一位程序员会说最好通过更多工作使代码更具弹性,而另一位程序员会说“为什么我需要做更多需要更多工作时的弹性代码”。我认为这取决于项目:)
  • 我刚刚发现一篇文章说 Recyclerview 是一种与您的项目没有任何关系的视图。所以它不应该引用你的模型。但仍在寻找正确的答案。
  • @AndroidStorm 我使用了几种模式,我认为没有一个是错的。选择题。现在我正在为适配器回调传递接口,这样我可以在几个屏幕上重用适配器。我可以在 Fragment 或 ViewModel 中扩展接口(所以我也可以在构造函数中传递 ViewModel)。我使用它加上数据绑定并且效果很好 - 例如我想“喜欢”帖子 - 接口使用回调来告诉 Fragment 它,Fragment 让我们 viewModel 处理调用,从调用中我正在更改帖子模型信息(喜欢的数量等)和它使用适配器中的数据绑定得到反映
【解决方案2】:

好吧,我为这个问题寻找了解决方案,但最终不得不自己处理。我想在这里发表我的想法以供讨论。

在我看来,简单地说,将 viewModel 实例传递给适配器并不优雅。相反,我建议您覆盖 RecyclerViewAdapter 的“onAttachedToRecyclerView”方法以获取您的 viewModel

public class YoursAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
......
private YoursViewModel viewModel;
......
    @Override
    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        if(viewModel==null){
            viewModel=new ViewModelProvider((ViewModelStoreOwner) recyclerView.getContext()).get(YoursViewModel.class);
        }
    }
......
}

为什么我认为这个解决方案很好?

1、ViewModel 本身与上下文无关。但是创建 ViewModel 的实例需要一个上下文。

2、你选择哪种语境? recyclerView 的上下文,因为你想在适配器内部做一些事情,并且适配器与一个recyclerView 相关联。为什么我覆盖“onAttachedToRecyclerView”?因为这个回调提供了一个recyclerView的引用,并且只执行一次。

3、只要recyclerView的上下文是活的,ViewModel就是活的。是你想要的吗?如果答案是“是”,那么根据 recyclerView 的上下文创建 ViewModel 实例是合理的。

4、你已经在 Fragment 中有一个 ViewModel。在适配器中创建一个新的是否合理?是的。 One of the advantages of ViewModel is sharing data只要他们在同一个活动中

5、如果您正确设计了 ViewModel,您实际上不需要观察适配器内部的 livedata(它需要再次使用上下文)。基本上你只是观察片段上的实时数据。您在适配器中的 ViewModel 只负责更改数据,而不关心数据如何更改,即在片段上执行yourViewModelInstance.post_value_to_liveData_and return_it().observe(),在适配器内部执行yourViewModelInstance.post_value_to_liveData_and return_it()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 2021-08-22
    • 2018-05-10
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多