android - MVVM:从内部 fragment 更新viewpager2的容器 View

标签 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源通过modelfactory传递到ExamsViewModel和QuestionViewModel。

但是现在我有些疑问:
  • 如何更新正确的LiveData?
  • 如果我在LiveData>中转换问题字段,并且ExamsModelView观察到它,那么如果我仅编辑列表的元素或我错了,则不会调用onChanged方法?
  • 更好地在modelview之间进行直接通信吗?
  • 最佳答案

    How can I update the correctAnswer LiveData ?



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

    If I trasform the questions field in a LiveData>, and the ExamsModelView observe it, the onChanged method is not called if I only edit an element of the list or I'm wrong ?



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

    Is better to make a directly comunication between modelview ?



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

    关于android - MVVM:从内部 fragment 更新viewpager2的容器 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62479927/

    相关文章:

    android - 使用 TextView 显示 ListView 中项目的附加信息

    java - PagedList 在使用 Room 的 Android 应用中不断增长但从未缩小

    casting - 在 Kotlin 中可以进行交叉转换吗?

    android - 在没有 LifecycleObserver 的情况下使用 LiveData

    java - Android SDK : Can I convert InputStream to FileInputStream?

    android - 当我到达最后一项时,寻呼机适配器未注册

    Android EditText 协程去抖操作符,如 RxJava

    android - 当 View 模型中更新另一个 LiveData 时触发 LiveData 成员的更新

    Android:程序类型已经存在:android.arch.lifecycle.LiveData$LifecycleBoundObserver

    c# - 不幸的是应用程序已停止 Xamarin C# Android