Суть MVVM и главное отличие от MVP в том, что View наблюдает за обновлениями ViewModel, при этом ViewModel не знает ничего о View.
Такое поведение реализуется через паттерн Observable-Observer и/или связывание данных (data binding).

Существуют следующие способы реализации MVVM в Android:

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

<TextView android:text="@{viewmodel.userName}" />


Библиотека Data Binding генерирует код, который обеспечивает связывание. При обновлении поля userName, обновится текст в TextView.

2. Использование ViewModel и LiveData
ViewModel (класс Architecture Components) реализован так, что переживает пересоздание активити и фрагментов. При использовании этого класса можно не беспокоиться о сохранении состояния, когда изменяется конфигурация.

LiveData – класс, реализующий паттерн Observable. LiveData принимает как наблюдателей объекты, которые реализуют интерфейс LifecycleOwner, например Activity и Fragment. Благодаря этому LiveData автоматически отписывает подписчиков при вызове onDestroy().
Data Binding может использоваться совместно с ViewModel и LiveData.

3. Кастомная реализация
Существует множество способов реализации связи между View и ViewModel, кроме предоставляемых библиотеками от Google.
Например ViewModel может использовать Observable из RxJava и View будет подписываться на обновления ViewModel так же как ViewModel подписывается на обновления Model.
Кастомная реализация добавляет больше гибкости, но нужно самому заботиться о сохранении состояния.