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



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

我有一个容器片段"考试",其中包含一个包含一些片段"问题"的ViewPager2。还有 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. 如何更新正确答案实时数据?
  2. 如果我在 LiveData> 中转换问题字段,并且 ExamsModelView 观察到它,如果我只编辑列表的一个元素或我错了,则不会调用 onChanged 方法?
  3. 模型视图之间直接进行通信是否更好?

如何更新正确答案实时数据?

使用对考试片段的回调。然后,考试片段将更新视图模型中的正确答案

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

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

模型视图之间直接进行通信是否更好?

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

最新更新