【问题标题】:getItemCount() in Recyclerview adapter returns 0 after asyncTask executionRecyclerview 适配器中的 getItemCount() 在 asyncTask 执行后返回 0
【发布时间】:2016-02-10 08:06:27
【问题描述】:

我正在尝试在带有RecyclerView 的自定义适配器中使用Asynctask,但支架是空的。第一次我在getItemCount(); 中得到 0,我不明白我错过了什么。请帮忙。

 @Override
    public int getItemCount() {
 new initTimeline().execute();
        Log.e("ICLength", String.valueOf(Length));
        return Length;
       }

      private class initTimeline extends AsyncTask<String, String, JSONObject> {
            private ProgressDialog pDialog;
            @Override
            protected void onPreExecute() {
                pDialog = new ProgressDialog(context);
                pDialog.setMessage("Loading...");
                pDialog.setIndeterminate(false);
                pDialog.setCancelable(false);
                pDialog.show();
            }

            @Override
            protected JSONObject doInBackground(String... args) {
                try {
                    // Execute HTTP Post Request
                     ..............
           }return jsonObject1;
        }

        @Override
        protected void onPostExecute(JSONObject json) {
            Log.e("AfterPE", String.valueOf(json));
            Length = json.length();
            Log.e("AfterPELen", String.valueOf(Length));
           pDialog.dismiss();
        }
    }
}

Logcat

02-10 02:33:17.867 4002-4002/com.example.mir E/ICLength: 0
02-10 02:33:19.057 4002-4002/com.example.mir E/AfterPE: {"id":"22","project_id":"2","date":"2015-11-30","description":"in progress"}
02-10 02:33:19.057 4002-4002/com.example.mir E/AfterPELen: 6

我在onPostExecute 中正确获取了Length 的值,但是 int getItemCount() 返回零。 请帮忙。

【问题讨论】:

  • 很明显,一旦您启动异步任务,它将获取数据并且您将获得计数,但在方法执行中向前推进,此时大小为零。我的意思是编译器不会停止,直到 asynctask 完成然后返回数据。它将与 asynctask 一起前进。
  • 是否有可能在您调用getItemCount() 时,AsyncTask 尚未完成?

标签: android android-asynctask android-recyclerview


【解决方案1】:

在getItemCount() 中,您启动了对 Web 服务的异步调用。 在此调用完成之前,getItemCount() 已经返回 0。

当您的 AsyncTask 完成执行时,您必须通知您的适配器您的数据已更改。致电notifyDatasetChanged 应该会为您执行此操作:

    @Override
    protected void onPostExecute(JSONObject json) {
        Log.e("AfterPE", String.valueOf(json));
        Length = json.length();
        Log.e("AfterPELen", String.valueOf(Length));
        pDialog.dismiss();
        notifyDatasetChanged();
    }

【讨论】:

  • Jörn Buitink:谢谢,但notifyDatasetChanged(); 似乎无法解决方法。请问还有什么其他建议吗?
【解决方案2】:

您正在进行异步调用。您的异步任务位于与主线程并行运行的工作线程上。第一次返回长度时,您的任务直到那个时候才会获取计数。

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    相关资源
    最近更新 更多