java.lang.IllegalStateException: O conteúdo do adaptador foi alterado, mas ListView… apesar da chamada notifydatasetchanged ()

Quais são as melhores práticas a serem seguidas para atualizar o conteúdo de um listactivty por um thread de segundo plano (Tarefa Assíncrona)?

1) Estou chamando onotifyDataSetChanged () para atualizar o adaptador assim que eu manipular o conteúdo do adaptador, mas ainda assim a força do aplicativo é fechada enquanto o usuário rola ou clica na lista. Qualquer ponteiro para evitar isso seria muito útil.

Logcat: java.lang.IllegalStateException: O conteúdo do adaptador foi alterado, mas o ListView não recebeu uma notificação.

2) Onde devo atualizar o conteúdo da lista? dentro do doInBackground () ou onProgressUpdate ()?

3) Estou experimentando falhas regulares quando o usuário clica no item da lista. Então, desabilitar os eventos de clique no listactivty durante a operação em segundo plano resolve o problema? Se não tiver certeza de como remover ou definir o item, clique em listeners dinamicamente para o listactivity. Por favor, me instrua sobre o também.

4) Eu não acho que bloquear todas as interações ui durante a execução da tarefa assíncrona é a única maneira de resolver o problema. Eu sei que há uma maneira simples de fazer isso, mas preciso de ajuda.

Desde já, obrigado.

Este é o meu 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);
  }

Minha tarefa assíncrona ...

          private class LongOperation extends AsyncTask<String, Void, String> {

          @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:

Eu raramente a exceção de ilegalstate também ... não é capaz de reproduzi-lo. Vou postar o logcat se eu me deparar com ele novamente.

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)

questionAnswers(4)

yourAnswerToTheQuestion