#android #mvvm #data-binding #architecture #android-viewpager
#Android #mvvm #привязка к данным #архитектура #android-viewpager
Вопрос:
Я пытаюсь удалить свой первый проект, используя шаблон MVVM.
У меня есть два фрагмента:
- MyViewCollection (фрагмент, содержащий список фрагментов с возможностью боковой прокрутки).
- 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);
}
Итак, у меня есть два вопроса:
- Это хорошая практика, когда «просмотры» в MVVM «разговаривают» друг с другом? (Если нет — как избежать этого в ситуациях, подобных моей?).
- Я знаю, что наилучшей практикой является запись в Room из ViewModels, но ViewModels не могут «разговаривать» друг с другом и с представлениями. Итак, как я должен хранить данные из «MyView», чтобы записать их в Room из «MyViewCollectionViewModel» (не из «MyViewViewModel»)?
Ответ №1:
лучше всего иметь две viewmodels в вашем MyView. вторая viewmodel — это модель совместного просмотра между всеми фрагментами, включая MyViewCollection. вы можете хранить там данные и выполнять свою работу. Подробнее об общих моделях просмотра