Обновление liveata с ответом на запрос Retrofit - PullRequest
0 голосов
/ 08 января 2019

У меня есть простое приложение, которое показывает список фильмов. Когда пользователь нажимает кнопку, он должен обновить список, что означает, что нужно снова перейти на Retrofit и получить новый список. Проблема в том, что это обновление не работает. Он выбирает список только один раз, когда я открываю приложение.

public class MoviesViewModel extends AndroidViewModel {
    private MutableLiveData<Resource<List<Movie>>> mLastdMovieListObservable;
    private Repository mRepository;

    public MoviesViewModel(Application application) {
        super(application);
        mRepository = new Repository();
    }

    public LiveData<Resource<List<Movie>>> getMovieListLiveData() {
        if (mLastdMovieListObservable == null) {
            mLastdMovieListObservable = mRepository.getMovieList();
        }
        return mLastdMovieListObservable;
    }
}

и хранилище:

public MutableLiveData<Resource<List<Movie>>> getMovieList() {
    final MutableLiveData<Resource<List<Movie>>> data = new MutableLiveData<>();
    data.setValue(Resource.loading(null));

    mInterface.getMovies(.....).enqueue(new Callback<MovieListResponse>() {
        @Override
        public void onResponse(Call<MovieListResponse> call, Response<MovieListResponse> response) {
            if (response.isSuccessful()) {
                data.postValue(Resource.success(response.body().getResult()));
            } else {
                data.postValue(Resource.error(response.message(), null));
            }
        }
        @Override
        public void onFailure(Call<MovieListResponse> call, Throwable t) {
            data.postValue(Resource.error(t.getMessage(), null));
        }
    });

    return data;
}   

Тогда во фрагменте это просто:

mMoviesViewModel.getMovieListLiveData().observe(this, moviesResource -> {
    if (moviesResource.status == Status.SUCCESS) {
       .....
       .....

затем часть нажатия кнопки, когда мне нужно снова получить список, я не уверен, как это реализовать. Все, что я пробовал, не сработало. Репозиторий сразу же вернул данные как нулевые.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Изменения для типов фильмов могут быть такими, как показано ниже:

public class MoviesViewModel extends AndroidViewModel {
private MutableLiveData<Resource<List<Movie>>> mLastdMovieListObservable;
private Repository mRepository;
private Int mMovieType = 0;

public MoviesViewModel(Application application) {
    super(application);
    mRepository = new Repository();
    mLastdMovieListObservable = Transformations.switchMap(mMovieType, type->
        mLastdMovieListObservable = mRepository.getMovieList(type)
    );
}

public LiveData<Resource<List<Movie>>> getMovieListLiveData() {
    return mLastdMovieListObservable;
}

public void setMovieType(Int movieType){
    mMovieType.setValue(movieType)
}

}

0 голосов
/ 08 января 2019

Вы можете использовать повторный подход, и я быстро изменил ваш код для примера повторной попытки и проверьте этот источник на предмет лучшего кода. LINK

Transformations.switchMap прослушивает попытку, и когда она изменилась, swithMap будет вызываться снова. И в пользовательском интерфейсе ViewModel должен быть настроен, как показано ниже, но в кнопке вам нужно вызвать просто повторить попытку.

mMoviesViewModel.getMovieListLiveData().observe(this, moviesResource -> {
if (moviesResource.status == Status.SUCCESS) {
   .....
   .....

А в кнопке:

mMoviesViewModel.retry()

Также ViewModel:

public class MoviesViewModel extends AndroidViewModel {
private MutableLiveData<Resource<List<Movie>>> mLastdMovieListObservable;
private Repository mRepository;
private Boolean mRetry = false;

public MoviesViewModel(Application application) {
    super(application);
    mRepository = new Repository();
    mLastdMovieListObservable = Transformations.switchMap(mRetry){
        mLastdMovieListObservable = mRepository.getMovieList()
    }
}

public LiveData<Resource<List<Movie>>> getMovieListLiveData() {
    return mLastdMovieListObservable;
}

public void retry(){
    mRetry.setValue(true)
}}
...