Я пытаюсь создать приложение, которое имеет 2 вкладки, которые отображают фильмы и телепередачи с помощью API themoviedb.org. Предполагается использовать модель MVVM, и я действительно запутался, потому что прошло всего 2 месяца с тех пор, как я начал программировать в Android. Как правильно передать его через каждый класс и правильно ли я использую метод дооснащения в классе репозитория?
Идея состоит в том, чтобы получить доступ к API через класс Repository и передать данные в класс ViewModel, а затем отобразить их в MovieFragment с помощью RecyclerView, но, похоже, мне не удалось передать данные через каждый класс.
+ Класс MovieRepository
public class MovieRepository {
private static MovieRepository instance;
private static ArrayList<Movie> movies = new ArrayList<>();
private final String API_KEY = "81d8f4353c2ade529071133972205017";
private String language;
private final String TAG = "repo";
public static MovieRepository getInstance() {
if (instance == null) {
instance = new MovieRepository();
}
return instance;
}
public static ArrayList<Movie> getMovies() {
return movies;
}
public MovieRepository() {
final ArrayList<Movie> movieJSON = new ArrayList<>();
language = "en_US";
ApiConfig api = new ApiConfig();
api.createInstance().loadMovieData(API_KEY, language).enqueue(new Callback<JSONResponse>() {
@Override
public void onResponse(Call<JSONResponse> call, Response<JSONResponse> response) {
ArrayList<Movie> jsonResults = response.body().getResults();
for (int i = 0; i < jsonResults.size() ; i++){
Movie movie = new Movie();
movie.setId(jsonResults.get(i).getId());
movie.setTitle(jsonResults.get(i).getTitle());
movie.setOverview(jsonResults.get(i).getOverview());
movie.setReleaseDate(jsonResults.get(i).getReleaseDate());
movie.setPosterPath(jsonResults.get(i).getPosterPath());
movieJSON.add(movie);
}
Log.d(TAG, "onResponse: " + jsonResults.toString());
}
@Override
public void onFailure(Call<JSONResponse> call, Throwable t) {
Log.d(TAG, "onFailure: " + t.getMessage());
}
});
this.movies = movieJSON;
}
+ Класс MovieViewModel
public class MovieViewModel extends ViewModel {
private static MutableLiveData<ArrayList<Movie>> movieData = new MutableLiveData<>();
private static ArrayList<Movie> movies;
public static LiveData<ArrayList<Movie>> getMoviesData() {
return movieData;
}
public static MovieAdapter init(MovieAdapter adapter) {
if (movies == null) {
movies = MovieRepository.getInstance().getMovies();
adapter.setMovies(movies);
}
return adapter;
}
+ Класс MovieFragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
movieViewModel = ViewModelProviders.of(this).get(MovieViewModel.class);
adapter = new MovieAdapter(getContext());
movieViewModel.init(adapter);
movieViewModel.getMoviesData().observe(this, new Observer<ArrayList<Movie>>() {
@Override
public void onChanged(@Nullable ArrayList<Movie> movies) {
adapter.notifyDataSetChanged();
}
});
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_movie_list, container, false);
if (view instanceof RecyclerView) {
final Context context = view.getContext();
RecyclerView recyclerView = (RecyclerView) view;
recyclerView.setLayoutManager(new LinearLayoutManager(context));
recyclerView.setAdapter(adapter);
}
return view;
}
всегда заканчивается NullPointer в адаптере (возможно, из-за того, что данные не удалось передать в адаптер)