Синхронизируйте пользовательский интерфейс и данные повторного просмотра в текущем фрагменте с пользовательским интерфейсом и данными повторного просмотра в соседнем фрагменте
Это "лайк" на Facebook. Я хотел бы синхронизировать эти повторные обзоры с этими двумя частями. Если вы нажмете кнопку "Мне нравится" в окне "Переработчик" одним куском, кнопка "Нравится" в окне "Переработчик" изменится, когда вы перейдете к другому продукту.
Какой метод я должен использовать? интерфейс? оказание услуг? Карта Должен ли я использовать это?
Какой метод вы используете для синхронизации данных двух фрагментов?
1 ответ
Вы должны использовать ViewModel из компонентов архитектуры. https://developer.android.com/topic/libraries/architecture/.
По сути, вы создаете модель представления в действии, чтобы она сохранялась с областью действия
//this is the instance of the activity
ViewModelProviders.of(this)
Затем вы можете получить экземпляр этой модели представления в каждом фрагменте, используя
ViewModelProviders.of(getActivity())
Модель представления может затем использоваться как в стандартной архитектуре MVVM.
Каждый фрагмент должен регистрироваться в компонентах, поддерживающих жизненный цикл, которые предоставит ViewModel. MutableLiveData - это один из таких компонентов, который вы можете использовать для предоставления данных тому, кто заинтересован в данных (в данном случае каждый фрагмент)
Имейте в виду, что LiveData, хотя и выполняет фантастическую работу, может быть ограничена, поскольку она хранит данные как состояние во времени. Это замечательно, но Android должен разрабатываться там, где он управляется событиями). Например, если у вас есть модель представления, которая отправляет данные в представление через liveata, это может вызвать диалог. Когда пользователь закрывает это диалоговое окно и вызывает изменение конфигурации (уничтожает и воссоздает действие), представление получит состояние активных данных в тот момент времени, когда они были установлены, и снова отобразит диалоговое окно. По сути, каждый раз, когда вы поворачиваете устройство, оно может отображать диалоговое окно, даже если вы его отклонили. Хакерское решение этой проблемы - уведомить модель представления об удалении состояния в liveata после закрытия диалогового окна. но это создает ряд других проблем, включая связывание состояния представления с моделью представления
Это намного более гибко, если компонент, поддерживающий жизненный цикл, вместо этого отправляет события, когда данные изменяются. Подумайте, Rxjava, который осведомлен о жизненном цикле. Вы добавляете данные в компонент RXJava, и наблюдаемая предоставляет данные наблюдателю, когда представление находится в состоянии его использования (> onresume и Надеюсь, это даст вам отправную точку. Дайте мне знать, если вам нужно больше деталей