Просматривая образцы, я увидел 2 подхода к MVVM с использованием компонентов архитектуры Android.
Первый подход:
ViewModel
обеспечиваетLiveData
Activity
подписывается наLiveData
- Когда наблюдатель с именем
Activity
устанавливает данные вViewModel
ObservableField
. - Весь
ViewModel
передается в привязку. В
xml
вы просто устанавливаетеObservableField
как значение<ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" app:visibleGone="@{viewmodel.listLoading}"/> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swiperefresh" android:layout_width="match_parent" android:layout_height="match_parent" app:refreshing="@{viewmodel.listRefreshing}" app:onRefreshListener="@{() -> viewmodel.refreshList()}" app:visibleGone="@{!viewmodel.listLoading}">
Плюсы. Мне не нужно передавать состояние (например, "загрузка"), так как я обновляю listLoading
ObservableField
в ViewModel
следующим образом:
val listLoading = ObservableBoolean(false)
/** other observable fields go here **/
val list: MutableLiveData<List<Item>> = MutableLiveData()
fun loadList() {
listLoading.set(true)
repo.getList { items ->
list.value = items
listLoading.set(false)
}
}
Минусы. Есть ли у этого подхода недостатки?
Второй подход:
ViewModel
обеспечиваетLiveData
Activity
подписывается наLiveData
- Когда наблюдатель с именем
Activity
передается в привязку - В привязку передается только нужный объект (pojo).
Плюсы. Какие плюсы у этого подхода?
Минусы: состояние должно возвращаться из ViewModel
. В этом примере от Google данные заключены в объект Resource
.
Первый подход используется в другом примере приложения от Google< /а>
Я хотел бы знать, каковы плюсы и минусы обоих шаблонов от разработчиков с большим опытом работы с Android Data Binding и Android Arch Components.