【问题标题】:RecyclerView /Adapter not refresh with new data in AsyntaskRecyclerView /Adapter 不使用 Asynctask 中的新数据刷新
【发布时间】:2016-11-23 18:19:44
【问题描述】:

在主要活动中,我调用一个 API 来下载最流行的电影。下载电影时,我调用adatper .notifyDataSetChanged(); 这个调用是在 onPostExecute()of Asyntask 中进行的,但是 recycler 上没有任何变化。

主要部分:

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的请求是正确的,我得到了信息,因为当我调试时,我可以看到它。

如何让它刷新?

更新

【问题讨论】:

  • 使用 OkHttp 时不需要 AsyncTask...stackoverflow.com/questions/34967505/…
  • 请学习java的基础...给变量赋值...。
  • 而不是mMovieList = gson.fromJson(responseJson, listType); 你能试试mMovieList.addAll(gson.fromJson(responseJson, listType))
  • 见这里。注意说不要的注释。 github.com/codepath/android_guides/wiki/…
  • 再次感谢@cricket_007 我解决了将gson给出的对象添加到mMovieList

标签: android android-asynctask android-adapter android-recyclerview


【解决方案1】:

能否请您展示您的适配器类。我认为您必须在适配器类中创建setmovies() 函数,然后在mMovieAdapterRecyclerView.notifyDataSetChanged(); 之前在postexecute() 方法中调用该函数

【讨论】:

  • 不。不需要任何方法。不应重新分配该列表。
  • 好的,那么请在 postexecute() 中尝试以下代码:- mMovieAdapterRecyclerView = new MovieAdapterRecyclerView(this, mMovieList); mMovieAdapterRecyclerView.notifyDataSetChanged();
  • 对。这是一种方法,但电影列表可以在 doInBackground 方法中正确更新...... onPostExecute 很好
  • 你是调用多次还是一次?
  • 没有。我说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();
                }

检查列表是否获得正确的电影列表

【讨论】:

  • 如何传递布尔值和列表?不过,这不是必需的。列表可以通过成员变量直接访问
  • List 是全局的,所以我们可以传递对适配器的引用并传递进入 onPostExecute 内部的布尔值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多