java.lang.IllegalStateException: содержимое адаптера изменилось, но ListView… несмотря на вызов notifydatasetchanged ()

Каковы оптимальные методы для обновления содержимого listactivty с помощью фонового потока (Async Task)?

1) звонюnotifyDataSetChanged () обновить адаптер, как только я манипулирую содержимым адаптера, но все равно мое приложение закрывается, пока пользователь прокручивает или щелкает по списку. Любые указатели для предотвращения этого были бы очень полезны.

Logcat: java.lang.IllegalStateException: содержимое адаптера изменилось, но ListView не получил уведомление.

2) Где точно я должен обновить содержимое списка? внутри doInBackground () или onProgressUpdate ()?

3) Я испытываю регулярные сбои, когда пользователь нажимает на элемент списка. Так решит ли проблема отключение событий click для listactivty во время фоновой операции? Если это так, я не уверен, как динамически удалять или устанавливать прослушиватели щелчков элементов в соответствии со списком. Пожалуйста, проинструктируйте меня тоже.

4) Я не думаю, что блокировка всех взаимодействий пользовательского интерфейса во время выполнения фоновой асинхронной задачи является единственным способом решения проблемы. Я знаю, что есть простой способ сделать это, но мне нужна помощь.

Заранее спасибо.

Это мой onCreate ...

protected void onCreate(Bundle savedInstanceState) {    
super.onCreate(savedInstanceState);
setContentView(R.layout.fa);

tvStatus=(TextView) findViewById(R.id.tvStatus);

 adapter = new SimpleAdapter(
        this,
        mostPopularList,
        R.layout.list_item,
        new String[] {"title","author","views","date"},
        new int[] {R.id.textView1,R.id.textView2,R.id.textView4,R.id.textView3});
        //populateList();


        setListAdapter(adapter);
  }

Моя асинхронная задача ...

          private class LongOperation extends AsyncTask {

          @Override
          protected String doInBackground(String... params) {
        // code for adding new listactivty items 
          }      

          @Override
          protected void onPostExecute(String networkStatus) {
            adapter.notifyDataSetChanged();
          }

          @Override
          protected void onPreExecute() {

          }

          @Override
          protected void onProgressUpdate(Void... values) {

           }
          }

Logcat:

я редко являюсь исключением нелегального государства ... не могу воспроизвести его. опубликую logcat, если я столкнусь с ним снова.

FATAL EXCEPTION: main
java.lang.IndexOutOfBoundsException: Invalid index 7, size is 4
    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
    at java.util.ArrayList.get(ArrayList.java:311)
    at android.widget.SimpleAdapter.bindView(SimpleAdapter.java:147)
    at android.widget.SimpleAdapter.createViewFromResource(SimpleAdapter.java:126)
    at android.widget.SimpleAdapter.getView(SimpleAdapter.java:114)
    at android.widget.AbsListView.obtainView(AbsListView.java:1294)
    at android.widget.ListView.makeAndAddView(ListView.java:1727)
    at android.widget.ListView.fillDown(ListView.java:652)
    at android.widget.ListView.fillGap(ListView.java:623)
    at android.widget.AbsListView.trackMotionScroll(AbsListView.java:2944)
    at android.widget.AbsListView.onTouchEvent(AbsListView.java:2065)
    at android.widget.ListView.onTouchEvent(ListView.java:3315)
    at android.view.View.dispatchTouchEvent(View.java:3766)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
    at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
    at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1785)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4627)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
 Bhanu Kaushik19 окт. 2012 г., 18:40
пожалуйста, оставьте сообщение журнала кошек для лучшего понимания остальных
 Shark19 окт. 2012 г., 18:40
как насчет listView.postInvalidate ()?

Ответы на вопрос(4)

Когда я используюMotionEvent нажать наlistView перед вызовомAdapter.notifyDataSetChanged(), это действительно причинаНезаконное Государственное Исключение.

Так что я думаю этополезно вызыватьListView.setEnable(false) перед обновлением.listView

ин этого сбоя является то, что объект ArrayList не может полностью измениться. Итак, когда я удаляю элемент, я должен сделать это:

mList.clear();
mList.addAll(newDataList);

Это исправило крах для меня.

 EliaszKubala05 нояб. 2014 г., 14:53
Это'работа для меня! Благодарю.

проверьте это в этом классе. Есть отличный пример использования AsyncTask и Listviewhttp://android.okhelp.cz/java_android_code.php?o=%5Candroid-15%5CGestureBuilder%5Csrc%5Ccom%5Candroid%5Cgesture%5Cbuilder%5CGestureBuilderActivity.java#Problem.

Я считаю, что проблема в вашем коде заключается в том, что адаптер обновляет ваш ListView, и в этот момент пользователь щелкает в ListView, вызывая сбой в вашем приложении.

 ajan20 окт. 2012 г., 07:56
Я тоже так думал. Но я неУ меня есть прослушиватель по элементам для моего прослушивания. Более того, иногда я получаю следующую ошибку java.lang.IndexOutOfBoundsException: неверный индекс 2, размер равен 0. Я подозреваю, что сбой происходит при прокрутке :-(
Решение Вопроса

d () или onProgressUpdate ()?

внутриonProgressUpdate() или внутри onPostExecute (), потому что это может занять некоторое время, так как вы меняете содержимое вdoInBackground() и вызвать асинхронную задачу вызывает ваш

          @Override
          protected void onPostExecute(String networkStatus) {
            adapter.notifyDataSetChanged();
          }

3) Я испытываю регулярные сбои, когда пользователь нажимает на элемент списка. Так решит ли проблема отключение событий click для listactivty во время фоновой операции? Если это так, я не уверен, как динамически удалять или устанавливать прослушиватели щелчков элементов в соответствии со списком. Пожалуйста, проинструктируйте меня тоже.

Это не решение. Вам просто нужно обновить ваш набор данных в потоке пользовательского интерфейса. (Не загружать контент, просто обновить со старого на новый). Например

private class LongOperation extends AsyncTask<string, void,="" string=""> {

      @Override
      protected List<string> doInBackground(String... params) {
           List<string> items = loadUpdatedDataset(params);
           return items;
      }      

      @Override
      protected void onPostExecute(List<string> loadedItems) {
        updateAdapterDataset(loadedItems);
        adapter.notifyDataSetChanged();
      }

      @Override
      protected void onPreExecute() {

      }

      @Override
      protected void onProgressUpdate(Void... values) {

       }
      }
</string></string></string></string,>

Ваш ответ на вопрос