MVVM:从内部片段更新viewpager2的容器视图

时间:2020-06-19 23:35:01

标签: android kotlin android-livedata android-mvvm android-viewpager2

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

我有一个容器片段“ Exams”,其中包含一个ViewPager2,其中包含一些片段“ 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都会验证他自己的问题,但同时,每次有新的正确答案时,正确的Answer LiveData值都应增加。 MyExamData源通过模型工厂传递到ExamsViewModel和QuestionViewModel。

但是现在我有些疑问:

  1. 如何更新正确的答案LiveData?
  2. 如果我在LiveData中转换问题字段,并且ExamsModelView观察到它,那么如果我仅编辑列表的元素或我错了,就不会调用onChanged方法?
  3. 最好在modelview之间直接通信吗?

1 个答案:

答案 0 :(得分:1)

如何更新正确的答案LiveData?

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

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

如果将元素添加到列表,它将不会调用观察者。有解决方法。参见Notify Observer when item is added to List of LiveData

最好在modelview之间进行直接通信吗?

ModelViews保存一个或多个视图的数据。因此,他们不应该互相交流。它与MVVM体系结构背道而驰。如果您处于这样的位置,请考虑将一个ModelView用于多个视图。这通常是通过使用活动创建一个ModelView来实现的,该活动也保存该活动中所有片段的数据。