Как показать LoadingState при использовании Room Livedata MVVM - PullRequest
1 голос
/ 07 марта 2019

так что я исходил из фона MVP ... Что я в основном пытаюсь сделать, так это запустить загрузку ViewView, как только мы начнем извлекать данные из Room (SQLite), остановить загрузку ViewView, если все прошло успешно, и все такоелогика должна быть обработана в моем ViewModel (пытаясь сохранить мой фрагмент чистым) для фрагмента.

Что я сделал сейчас, так это то, что у меня есть два LiveData:

  1. Мои фактические данные, которые поступают из БД
  2. Ливата для состояния фрагмента:

Вот что я имею в виду:

enum HomeState{
    LOADING,
    LIVE
}    
private LiveData<List<SomeData>> someData;
private MutableLiveData<HomeState> homeState;

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

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Я использую состояние загрузки в mvvm, rx, kotlin, retorfit для recyclerview.

Здесь - мое текущее состояние загрузки.

Здесь - мой адаптер привязки для наблюдения за состоянием загрузки.

Здесь - это мой расширенный recyclerview класс для загрузки состояния и пустого представления.

Здесь - мой xml-файл для состояния загрузки привязки.

Может быть, вы можете черпать вдохновение из моего примера.

1 голос
/ 08 марта 2019

Как вы, вероятно, видите, это не сработает, так как при поступлении новых данных он сразу переходит во фрагмент, и я не могу управлять логикой homeState из ViewModel

Вы можете управлять homeState на основе базы данных LiveData, помещая себя между наблюдателем фрагмента и базой данных LiveData.Вы могли бы сделать это либо с помощью Transformation, либо с помощью MediatorLiveData.

// with a Transformation
// this would be the method which returns the database LiveData
public LiveData<List<SomeData>> getDatabaseData() {
     // the view should show a loading indicator
     homeState.setValue(HomeState.LOADING);
     // we don't actually map anything, we just use the map function to get 
     // a callback of when the database's LiveData has finished loading  
     return Transformations.map(dao.getSomeData(), list -> {
         // the database has just finished fetching the data from the database
         // and after this method returns it will be available to the observer
         // in the fragment.
         // we also need to dismiss the loading indicator
         homeState.setValue(HomeState.LIVE);
         return list;
     });
}

С MediatorLiveData вы могли бы сделать нечто подобное, просто заставив MediatorLiveData прослушивать базу данных LiveData и обновить homeState внаблюдатель устанавливает, когда вы добавляете базу данных LiveData в качестве ее источника.

Если вы хотите абстрагировать это, вы можете объединить данные, которые вы получаете из базы данных, и состояние (загрузка или доступность) в один класс и изменитьваша ViewModel для возврата только LiveData с этим классом.В руководстве по компонентам архитектуры приведен пример (вроде как) о том, как вы можете это сделать, там они отслеживают состояние сети, но вы можете легко адаптировать это к сценарию вашей базы данных.

...