Невозможно вызвать onChange при изменении данных из MutableLiveData - PullRequest
0 голосов
/ 13 мая 2018

У меня есть MovieRepository, который извлекает JSON с помощью Retrofit, он отвечает за все данные, используемые в этом приложении, единственный источник правды.Затем у меня есть MainActivityViewModel, который использует MovieRepository, он отвечает за передачу данных на уровень пользовательского интерфейса.

Внутри моего MainActivity у меня есть пункт меню: Most popular и Top rated option, когда пользователь нажимает на него, я хотел бы изменить на UI.Вот мой подход:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

        case R.id.top_rated_menu:
            viewModel.getMovie(MovieAPIUtils.Endpoints.TOP_RATED_ENDPOINT);
            return true;

        case R.id.most_popular_menu:
            viewModel.getMovie(MovieAPIUtils.Endpoints.POPULAR_ENDPOINT);
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}

Мой getMovie() метод в модели представления таков:

public class MainActivityMovieViewModel extends ViewModel {

    private static final String TAG = MainActivityMovieViewModel.class.getSimpleName();

    private MutableLiveData<ReturnMovie> movie;
    private MovieRepository repo = new MovieRepository();
    private String search = null;

    public LiveData<ReturnMovie> getMovie(String searchTerm) {

       if (movie == null) {
           movie = repo.search(searchTerm);
       }
        return movie;
    }
}

А вот мой репозиторий:

public class MovieRepository {

    private static final String TAG = MovieRepository.class.getSimpleName();

    public MutableLiveData<ReturnMovie> search(final String term) {
        final MutableLiveData<ReturnMovie> data = new MutableLiveData<>();

        MovieService service = ServiceGenerator.createService(MovieService.class);
        Call<ReturnMovie> call = service.requestMovie(term, MovieAPIUtils.KEY);

        call.enqueue(new Callback<ReturnMovie>() {
            @Override
            public void onResponse(Call<ReturnMovie> call, Response<ReturnMovie> response) {
                ReturnMovie movie = response.body();
                data.setValue(movie);
            }
            @Override
            public void onFailure(Call<ReturnMovie> call, Throwable t) {
                Log.d(TAG, t.toString());
            }
        });
        return data;
    }
}

По какой-то причине, когда вызывается viewModel.getMovie(), метод onChange из LiveData не запускается, я пытался прочитать документацию по архитектуре Android и пробовал другой подход, но все равно не получилось.

Вот мой OnCreate() в MainActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    viewModel = ViewModelProviders.of(this).get(MainActivityMovieViewModel.class);
    initRecyclerViewWithMovies();

    final Observer<ReturnMovie> observer = new Observer<ReturnMovie>() {
        @Override
        public void onChanged(@Nullable ReturnMovie returnMovie) {
            mMovieAdapter.swapCursor(returnMovie.getResults());
        }
    };

    viewModel.getMovie(MovieAPIUtils.Endpoints.POPULAR_ENDPOINT)
            .observe(this, observer);
}

Для полного кода:

https://github.com/brendoncheung/PopularMovie/tree/mvvm_approach

Большое спасибо!

...