cw无尽适配器的illegalstateexception



首先感谢CommonsWare为这个伟大的组件。但我有个问题一直困扰着我。即——> java.lang。适配器的内容已经改变,但是ListView没有收到通知。确保适配器的内容不是从后台线程修改的,而是从UI线程修改的。

以上是我有时得到的错误,但有时不是。下面是我的代码。

 protected boolean cacheInBackground() {
                  JSONObject json = null;
                  if(results != null)
                     results.clear();
                  results = new ArrayList<DataSource>();// results is the global variable which is List<DataSource> results; and initialized it here.
                  List<NameValuePair> params = new ArrayList<NameValuePair>();
                   params.add(new BasicNameValuePair("postdata",passeddata));
                   params.add(new BasicNameValuePair("currentpage", (++index)+""));
            json = jParser.makeHttpRequest(urlphp, "POST", params);   // Here is the line that makes http request for paginated results based on index and gets the response.
                  try {
                        int success = json.getInt("success");
                        if (success == 1) {
                            rowcount = json.getInt("numrows");
                            Log.d("row count value is>>>>",""+rowcount); // Here rowcount is the total rows in the database
                            products = json.getJSONArray("products");
                            // looping through All Products
                            for (int i = 0; i < products.length(); i++) {
                                JSONObject c = products.getJSONObject(i);
                              // Storing each json item in variable
                            String id = c.getString(ID);
                            String price = c.getString(PRICE);
                            String name = c.getString(NAME);
                DataSource data = new DataSource(id,name,price);
                            results.add(data);

                        }
                    }else{
                          // product not found
                        successpass = success;
                        message = json.getString("message");
                          return false;
                      }
                  } catch (JSONException e) {
                      e.printStackTrace();
                  }
                  return(getWrappedAdapter().getCount()<rowcount);

          }

     @Override
      protected void appendCachedData() {
        if (getWrappedAdapter().getCount()<rowcount) {
          @SuppressWarnings("unchecked")
          CustomListAdapter adapter = (CustomListAdapter)getWrappedAdapter();
          //ArrayAdapter<Integer> a=(ArrayAdapter<Integer>)getWrappedAdapter();
            for (DataSource d : results){
                adapter.add(d);
            }
        }else{
        }
      }

正如您在代码中看到的,我将数据存储到Bean类对象中,然后将每个对象存储在List中。我已经实现了CustomListView来在列表中显示详细信息。

然而,有时会出现上述错误,有时不会。为此搜索了很多,发现了这个和其他一些一般适配器问题,如此等,但我得到这个错误,即使没有点击placeholder,甚至没有调用notifyDataSetChanged()。正如你可以看到在我的代码我从来没有调用notifyDataSetChanged(),但为什么这个错误发生?我的实现编码有什么问题吗?有人能帮我解决这个问题吗?当我在我的应用程序中深度集成这个组件时,我现在害怕看到替代方案。

下面是堆栈跟踪:

03-13 16:12:07.662: E/AndroidRuntime(494): FATAL EXCEPTION: main
03-13 16:12:07.662: E/AndroidRuntime(494): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2130968671, class android.widget.ListView) with Adapter(class com.example.onlinedata.ORAdsList$CustomisedEndlessAdapter)]
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.widget.ListView.layoutChildren(ListView.java:1492)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.widget.AbsListView.onLayout(AbsListView.java:1147)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.view.View.layout(View.java:7035)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.view.View.layout(View.java:7035)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.view.View.layout(View.java:7035)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.view.View.layout(View.java:7035)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.view.View.layout(View.java:7035)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.view.View.layout(View.java:7035)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1045)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.os.Looper.loop(Looper.java:123)
03-13 16:12:07.662: E/AndroidRuntime(494):  at android.app.ActivityThread.main(ActivityThread.java:4627)
03-13 16:12:07.662: E/AndroidRuntime(494):  at java.lang.reflect.Method.invokeNative(Native Method)
03-13 16:12:07.662: E/AndroidRuntime(494):  at java.lang.reflect.Method.invoke(Method.java:521)
03-13 16:12:07.662: E/AndroidRuntime(494):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-13 16:12:07.662: E/AndroidRuntime(494):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-13 16:12:07.662: E/AndroidRuntime(494):  at dalvik.system.NativeStart.main(Native Method)

终于有人给了我一个可重复的测试用例,这个错误现在在v1.2.1中被修复了。获取一个新的repo副本,或者一个新的JAR。在v1.2.0版本中不需要修改代码。

最新更新