java.lang.IllegalStateException для бесконечного адаптера cw

Прежде всего, спасибо CommonsWare за этот замечательный компонент. Но у меня есть проблема, которая несколько раз меня огорчала. То есть -> java.lang.IllegalStateException: содержимое адаптера изменилось, но ListView не получил уведомления. Убедитесь, что содержимое вашего адаптера изменено не из фонового потока, а только из потока пользовательского интерфейса.

Вышеупомянутая ошибка, которую я иногда получаю, но иногда нет. Ниже мой код.

 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, чтобы отображать детали в виде списка.

Однако иногда вышеупомянутая ошибка возникает, а иногда нет. Мы много искали это и обнаружили this и некоторые другие общие проблемы с адаптером, такие как this и т. д., но я понимаю это ошибка даже без нажатия на 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)

person rick    schedule 13.03.2013    source источник
comment
Выложите, пожалуйста, всю трассировку стека.   -  person CommonsWare    schedule 13.03.2013
comment
@CommonsWare Я никогда не думал, что смогу поблагодарить вас напрямую. Большое Вам спасибо. Я обновил свой вопрос с помощью трассировки стека. Думаю, только ты сможешь решить мою проблему.   -  person rick    schedule 13.03.2013
comment
Единственный способ возникновения ошибки - это изменение содержимого адаптера в фоновом потоке. EndlessAdapter не должен этого делать, это означает, что либо вы делаете это сами в другом месте, либо в EndlessAdapter есть ошибка. Чтобы иметь надежду исправить такую ​​ошибку, мне нужен повторяемый тестовый пример. Если вам случится создать повторяемый тестовый пример, прикрепите его (вместе с шагами, которые мне нужно выполнить, чтобы использовать) на проблема, которую вы открыли.   -  person CommonsWare    schedule 13.03.2013
comment
@CommonsWare Но я вставил свой подробный код выше. Как показано, данные добавляются в адаптер только в appendCachedData () этой строкой adapter.add (d); :( Я до сих пор не знаю, что вызывает эту ошибку. Как создать воспроизводимый тестовый пример? Потому что это происходит в моем приложении несколько раз.   -  person rick    schedule 13.03.2013
comment
Как сделать воспроизводимый тестовый пример? - если бы я знал это, я бы сделал это сам. Я ни разу не сталкивался с этой ошибкой. Следовательно, у меня нет возможности исправить это, потому что даже если я произвольно внесу изменения в код, я понятия не имею, действительно ли эти случайные изменения помогают.   -  person CommonsWare    schedule 13.03.2013
comment
Дело в том, что иногда это происходит, а иногда нет, даже когда я выполняю те же шаги в самом приложении. Переходя к воспроизводимому тесту - ›Я просто спросил, нужно ли мне делать что-то вроде демонстрации, чтобы воспроизвести этот случай?   -  person rick    schedule 13.03.2013
comment
Я просто спрашивал, нужно ли мне делать что-то вроде демонстрации, чтобы воспроизвести этот случай? - только в том случае, если вы можете придумать серию шагов, которые приводят к тому, что ошибка возникает всегда. В противном случае это не поможет никому из нас. Я когда-нибудь буду ткнуть код, чтобы посмотреть, смогу ли я найти проблему чисто на глаз, но я не надеюсь.   -  person CommonsWare    schedule 13.03.2013
comment
Ага. Я понимаю. Это происходит не всегда. Очень странно, что это происходит всего несколько раз, хотя я выполняю те же действия, когда это вызвало ошибку.   -  person rick    schedule 13.03.2013
comment
Кажется, эта проблема возникает при обновлении значений в endlessadapter (и вызове notifyDataSetChanged) между TouchEvent DOWN и TouchEvent UP. Итак, TouchEvent Down - ›обновить значения -› TouchEvent UP - ›this незаконное исключение   -  person vbsteven    schedule 27.03.2013


Ответы (1)


Кто-то наконец дал мне воспроизводимый тестовый пример, и теперь эта ошибка исправлена ​​в версии 1.2.1. Возьмите новую копию репо или новый JAR. По сравнению с версией 1.2.0 никаких изменений кода не требуется.

person CommonsWare    schedule 25.04.2013
comment
Это то, что вызвало сбой, даже когда я тестировал. Но я думаю, что получил это случайно. В любом случае, собираюсь включить новую банку и протестировать ее. Большое спасибо за ответ. - person rick; 29.04.2013