У меня есть 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
Большое спасибо!