-3

В основном я называю API для downlaod самых популярных фильмов. Когда загружаются фильмы, я вызываю adatper .notifyDataSetChanged(); Этот вызов выполнен в onPostExecute() Asyntask, но изменений в утилизации нет.RecyclerView/Adapter не обновляется с новыми данными в Asyntask

Часть Main:

mMovieList = new ArrayList<>(); 
     mMovieAdapterRecyclerView = new MovieAdapterRecyclerView(this, mMovieList); 
     RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this); 
     mRecyclerView.setItemAnimator(new DefaultItemAnimator()); 
     mRecyclerView.setLayoutManager(mLayoutManager); 
     mRecyclerView.setAdapter(mMovieAdapterRecyclerView); 
     receiveMovies(); 

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

private void receiveMovies() { 

     new AsyncTask<Void, Void, Boolean>() { 
      @Override 
      protected Boolean doInBackground(Void... voids) { 
       try { 
        JSONObject response = null; 
        OkHttpClient client = new OkHttpClient(); 
        MediaType JSON = MediaType.parse("application/json; charset=utf-8"); 

        String mUrl = ConnectionUtils.TRAKT_URL + ConnectionUtils.POPULAR + ConnectionUtils.ALL_INFO; 
        Request request = new Request.Builder() 
          .url(mUrl) 
          .addHeader(ConnectionUtils.TRAKT_API_VERSION, ConnectionUtils.TRAKT_API_VERSION_NUM) 
          .addHeader(ConnectionUtils.TRAKT_API_KEY, ConnectionUtils.API_KEY) 
          .addHeader(ConnectionUtils.TRAKT_CONTENT, JSON.toString()) 
          .get() 
          .build(); 

        Response clientResponse = client.newCall(request).execute(); 
        int code = clientResponse.code(); 
        String responseJson = clientResponse.body().string(); 
        Gson gson = new Gson(); 
        Type listType = new TypeToken<List<Movie>>() { 
        }.getType(); 
        mMovieList = gson.fromJson(responseJson, listType); 
        return true; 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       return false; 
      } 

      @Override 
      protected void onPostExecute(Boolean aBoolean) { 
       if(aBoolean) { 
        mMovieAdapterRecyclerView.notifyDataSetChanged(); 
       } 
      } 
     }.execute(); 
    } 

Запрос на API правильно, и я получаю информацию, потому что когда я отладки, я могу видеть это.

Как я могу его обновить?

UPDATE

enter image description here

+0

Вам не нужно AsyncTask при использовании OkHttp ... http://stackoverflow.com/questions/34967505/android -okhttp-асинхронные вызовы –

+1

Пожалуйста, изучите базовую базу java ... присваивая значения переменной ... – Selvin

+0

вместо 'mMovieList = gson.fromJson (responseJson, listType);' вы могли бы попробовать 'mMovieList.addAll (gson.fromJson (responseJson, listType)) ' –

ответ

-2
if(aBoolean) { 
       // pass the updated list here which you get after downloading 
       // like mMovieAdapterRecyclerView.updateMoviewList(passList) 
        mMovieAdapterRecyclerView.notifyDataSetChanged(); 
       } 

проверить, является ли список получать надлежащий список фильмов или не

+0

Как бы вы передали логическое и список? Это не обязательно. Список может быть напрямую доступен переменной-членом –

+0

Список является глобальным, поэтому мы можем передать ссылку на адаптер и передать логическое значение, которое находится внутри onPostExecute –

0

Можете ли вы показать свой класс адаптера. Я думаю, что вы должны сделать setmovies() функцию в классе адаптера, а затем вызвать эту функцию в postexecute() метода перед тем mMovieAdapterRecyclerView.notifyDataSetChanged();

+0

Нет. Никаких методов не требуется. Список не следует переназначать. –

+0

ОК, пожалуйста, попробуйте следующий код в postexecute(): - mMovieAdapterRecyclerView = новый MovieAdapterRecyclerView (это, mMovieList); mMovieAdapterRecyclerView.notifyDataSetChanged(); – Sarbjyot

+0

Справа. Это один из способов, но список фильмов может быть правильно обновлен методом doInBackground ...OnPostExecute в порядке –

Смежные вопросы