首页 > 解决方案 > MVVM:从内部片段更新 viewpager2 的容器视图

问题描述

我遇到了麻烦:DI 开始使用 mvvm 和 LiveData,我想以更好的方式做到这一点。我将尝试通过一个简单的示例向您解释我的疑问:

我有一个包含 ViewPager2 的容器片段“Exams”,其中包含一些片段“Question”。还有 ExamsViewModel 和 QuestionViewModel。没有 db,我唯一的数据源是 MyExamDataSource,如下所示:

class MyExamDataSource {
    val questions:ArrayList<Question> = ArrayList()

    fun saveQuestionResult(){
      ...
    }

    fun getQuestion():Question{
      ...
    }

    ...
    ...
}

data class Question(val correct:Boolean, val selectedAnswers:ArrayList<Int>)

class ExamViewModel(myExamsDataSource: MyExamsDataSource): ViewModel() {

    val correctAnswer:LiveData<Int> = MutableLiveData<Int>(0)
    ...
    ...   
}

每个 QuestionViewModel 都会验证他自己的问题,但与此同时,每次有新的正确答案时,正确答案 LiveData 都应该增加。MyExamData 源通过模型工厂传递给 ExamsViewModel 和 QuestionViewModel。

但现在我有一些疑问:

  1. 如何更新正确答案 LiveData ?
  2. 如果我在 LiveData> 中转换问题字段,并且 ExamsModelView 观察它,如果我只编辑列表的一个元素或者我错了,则不会调用 onChanged 方法?
  3. 更好地在 modelview 之间进行直接通信?

标签: androidkotlinandroid-livedataandroid-mvvmandroid-viewpager2

解决方案


如何更新正确答案 LiveData ?

使用对考试片段的回调。然后考试片段将更新 ViewModel 中的正确答案

如果我在 LiveData> 中转换问题字段,并且 ExamsModelView 观察它,如果我只编辑列表的一个元素或者我错了,则不会调用 onChanged 方法?

如果将元素添加到列表中,它不会调用观察者。有解决方法。请参阅将项目添加到 LiveData 列表时通知观察者

更好地在 modelview 之间进行直接通信?

ModelViews 保存一个或多个视图的数据。因此,他们不应该相互交流。它违背了 MVVM 架构。如果您处于这样的位置,请考虑将一个 ModelView 用于多个视图。这通常通过创建一个带有活动的 ModelView 来实践,该活动也包含该活动中所有片段的数据。


推荐阅读