Как правильно проанализировать JSON с помощью Retrofit и реализовать его в RecyclerView? - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь создать приложение, которое имеет 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 в адаптере (возможно, из-за того, что данные не удалось передать в адаптер)

...