MVVM: обновление представления контейнера viewpager2 из внутренних фрагментов - PullRequest
2 голосов
/ 20 июня 2020

У меня проблемы: Я начинаю использовать 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 проверяет свой собственный вопрос, но в то же время правильный ответ LiveData должен увеличиваться каждый раз, когда появляется новый правильный ответ. Источник MyExamData передается через фабрику моделей в ExamsViewModel и QuestionViewModel.

Но теперь у меня есть некоторые сомнения:

  1. Как я могу обновить правильный ответ LiveData?
  2. Если я преобразовать поле вопросов в LiveData> и ExamsModelView наблюдать за ним, метод onChanged не вызывается, если я редактирую только элемент списка, или я ошибаюсь?
  3. Лучше сделать прямое общение между вид модели?

1 Ответ

1 голос
/ 20 июня 2020

Как я могу обновить правильные данные LiveData ответа?

Используя обратные вызовы к фрагменту Exams. Затем фрагмент экзамена обновит правильный ответ в ViewModel

Если я изменю поле вопросов в LiveData>, и ExamsModelView наблюдает за ним, метод onChanged не вызывается, если я редактирую только элемент списка или я ошибаюсь?

Если вы добавите элемент в список, он не будет вызывать наблюдателей. Для этого есть обходные пути. См. Notify Observer, когда элемент добавлен в список LiveData

Лучше сделать прямую связь между просмотром модели?

ModelViews хранят данные для одного или несколько просмотров. Поэтому они не должны общаться друг с другом. Это противоречит архитектуре MVVM. Если вы находитесь в таком положении, рассмотрите возможность использования одного ModelView для нескольких представлений. Это часто практикуется путем создания одного ModelView с действием, которое также содержит данные для всех фрагментов в этом действии.

...