-3

在主要活动中,我称之为下载最流行电影的API。当下载电影时,我会调用adatper .notifyDataSetChanged(); 这个电话是在Asyntask的onPostExecute()中完成的,但回收站没有变化。主要的RecyclerView/Adapter不会随Asyntask中的新数据刷新

部分:

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

当您使用OkHttp ... http://stackoverflow.com/questions/34967505/android你并不需要一个的AsyncTask -okhttp-asynchronous-calls –

+1

请学习java的basic ...将值赋给变量.... – 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 = new MovieAdapterRecyclerView(this,mMovieList); mMovieAdapterRecyclerView.notifyDataSetChanged(); – Sarbjyot

+0

没错。这是一种方法,但电影列表可以在doInBackground方法中正确更新...onPostExecute很好 –