我很麻烦: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。
但是现在我有些疑问:
答案 0 :(得分:1)
如何更新正确的答案LiveData?
使用对Exams片段的回调。然后,考试片段将更新ViewModel中的正确答案
如果我在LiveData中转换问题字段,并且 ExamsModelView观察它,如果我不调用onChanged方法 只编辑列表中的一个元素,否则我错了?
如果将元素添加到列表,它将不会调用观察者。有解决方法。参见Notify Observer when item is added to List of LiveData
最好在modelview之间进行直接通信吗?
ModelViews保存一个或多个视图的数据。因此,他们不应该互相交流。它与MVVM体系结构背道而驰。如果您处于这样的位置,请考虑将一个ModelView用于多个视图。这通常是通过使用活动创建一个ModelView来实现的,该活动也保存该活动中所有片段的数据。