Android — MVVM с ViewPager

#android #mvvm #data-binding #architecture #android-viewpager

#Android #mvvm #привязка к данным #архитектура #android-viewpager

Вопрос:

Я пытаюсь удалить свой первый проект, используя шаблон MVVM.
У меня есть два фрагмента:

  1. MyViewCollection (фрагмент, содержащий список фрагментов с возможностью боковой прокрутки).
  2. MyView (фрагмент с боковой прокруткой).

У каждого из них есть ViewModels, которые используют привязку данных к текущим данным.
У меня есть кнопка «Посмотреть позже» в MyViewCollection, которая должна сохранять содержимое из MyView в Room DB.

  • MyViewViewModel отправляет для просмотра конкретные данные, которые должны содержаться внутри фрагмента.
  • Кнопка «Посмотреть позже» расположена в MyViewCollection, из-за наличия красивых статических кнопок над фрагментами с боковой прокруткой.
  • При нажатии кнопки из MyViewCollection я должен получить текущие данные из MyView и отправить их в Room.

Как я этого достиг.
MyView (фрагмент):

 Data currentData;
...

viewViewModel.getData().observe(this, data -> {
currentData = data;
...
}  
  

MyViewCollection (FragmentCollection):

 // on button clicked
viewCollectionViewModel.getIsDataToLoad().observe(this, aBoolean -> {

MyView fragment = (MyView) adapter.getFragmentActivity()
                    .getSupportFragmentManager()
                    .findFragmentByTag("f"   currentFragmentPos); // currentFramgentPos from onPageSelected (ViewPager2)

Data data = fragment.currentData;

// async task:
RepositoryDB.getRoomInstance().getDao().insertData(data);

}  
  

Итак, у меня есть два вопроса:

  1. Это хорошая практика, когда «просмотры» в MVVM «разговаривают» друг с другом? (Если нет — как избежать этого в ситуациях, подобных моей?).
  2. Я знаю, что наилучшей практикой является запись в Room из ViewModels, но ViewModels не могут «разговаривать» друг с другом и с представлениями. Итак, как я должен хранить данные из «MyView», чтобы записать их в Room из «MyViewCollectionViewModel» (не из «MyViewViewModel»)?

Ответ №1:

лучше всего иметь две viewmodels в вашем MyView. вторая viewmodel — это модель совместного просмотра между всеми фрагментами, включая MyViewCollection. вы можете хранить там данные и выполнять свою работу. Подробнее об общих моделях просмотра