amazing-animal-beautiful-beautifull

Продолжение.

Обмен данными между фрагментами

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

Эта общая точка боли может быть устранена с помощью объектов ViewModel. Эти фрагменты могут совместно использовать ViewModel, используя их область действия для обработки этого сообщения, как показано на следующем примере кода:

Обратите внимание, что оба фрагмента используют getActivity () при получении ViewModelProvider. В результате оба фрагмента получают один и тот же экземпляр SharedViewModel, который привязан к активности.

Этот подход предлагает следующие преимущества:

  • Деятельности не нужно ничего делать, или знать что-либо об этой связи.
  • Фрагменты не должны знать друг о друге, кроме контракта SharedViewModel. Если один из фрагментов исчезает, другой работает как обычно.
  • Каждый фрагмент имеет свой жизненный цикл и не зависит от жизненного цикла другого. Если один фрагмент заменяет другой, пользовательский интерфейс продолжает работать без каких-либо проблем.

Замена Loaders с помощью ViewModel

Классы загрузчика, такие как CursorLoader, часто используются для хранения данных в пользовательском интерфейсе приложения в синхронизации с базой данных. Вы можете использовать ViewModel с несколькими другими классами для замены загрузчика. Использование ViewModel отделяет ваш пользовательский интерфейс от операции загрузки данных, а это значит, что у вас меньше ссылок между классами.

В одном общем подходе к использованию загрузчиков приложение может использовать CursorLoader для наблюдения за содержимым базы данных. Когда значение в базе данных изменяется, загрузчик автоматически запускает перезагрузку данных и обновляет пользовательский интерфейс:

viewmodel-loader

ViewModel работает с Room и LiveData для замены loader. ViewModel гарантирует, что данные сохранятся при изменении конфигурации устройства. Номер информирует вашу LiveData, когда база данных изменяется, а LiveData, в свою очередь, обновляет ваш интерфейс с пересмотренными данными.

viewmodel-replace-loader

 

Читать ещё :   LiveData. Часть 3

Прим. мое. В этом блоге описано, как использовать ViewModel с LiveData для замены AsyncTaskLoader.

По мере того, как ваши данные становятся более сложными, вы можете выбрать отдельный класс для загрузки данных. Цель ViewModel — инкапсулировать данные для контроллера пользовательского интерфейса, чтобы изменения конфигурации данных сохранились. Сведения о том, как загружать, сохранять и управлять данными при изменении конфигурации, см. В разделе Сохранение состояния пользовательского интерфейса.

Продолжение следует…