5

Ich habe viel über SO auf SO gelesen, aber ich konnte in meinem Fall keine Lösung finden. Hier ist das Setup:Der Inhalt des Adapters hat sich geändert, aber ListView hat keine Benachrichtigung erhalten, nichts aktualisiert im Hintergrund

Aktivität A, enthält die Liste und die Daten werden angezeigt. Wenn async Aufgabe meines Datenmanager die Aktualisierung abgeschlossen ist, geschieht Folgendes:

protected void onPostExecute(Void v) { 
     super.onPostExecute(v); 

     if (editedDataSectionRows == null) 
      editedDataSectionRows = new int[] {0, 0, 0, 0, 0, 0, 0}; 

     mData= editedData; 
     mSectionRows = editedDataSectionRows; 

     if (mCallback != null) { 
      mCallback.dataUpdated(); 
     } 
    } 

Wenn die Daten aktualisiert werden, Aktivität A einen Rückruf erhält und führt Folgendes aus:

@Override 
public void dataUpdated() { 
    mData = mDataManagerInstance.getData(); 
    mDataSectionCount = mDataManagerInstance.getDataSectionRows(); 
    mListAdapter.notifyDataSetChanged(); 
} 

mdata ist ein Arraylist enthält alle "rows" und mDataSectionCount ist ein int [] mit Informationen darüber, wie mData in Abschnitte aufgeteilt werden soll.

Jetzt hat Aktivität A ein Optionsmenü, das eine zweite Aktivität öffnen kann. Aktivität B.

Hin und wieder wenn Affe und Aktivität B ausgeführt wird. Mein onResume für Aktivität A wird aufgerufen:

@Override 
protected void onResume() { 
    super.onResume(); 
    mDataManagerInstance = DataManager.getInstance(); 

    mDataManagerInstance.setDataUpdatedListener(this); 
    mDataManagerInstance.updateData(); 

    this.invalidateOptionsMenu(); 
} 

(update nur feuert weg meine AsyncTask wenn es nicht bereits läuft) Und dann Scheiße trifft den Fan ...:

FATAL EXCEPTION: main 
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(-1, class com.applidium.headerlistview.HeaderListView$InternalListView) with Adapter(class se.*.android.activities.ListActivity$1)] 
     at android.widget.ListView.layoutChildren(ListView.java:1582) 
     at android.widget.ListView.commonKey(ListView.java:2104) 
     at android.widget.ListView.onKeyDown(ListView.java:2085) 
     at android.view.KeyEvent.dispatch(KeyEvent.java:2620) 
     at android.view.View.dispatchKeyEvent(View.java:7149) 
     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1458) 
     at android.widget.ListView.dispatchKeyEvent(ListView.java:2070) 
     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1462) 
     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1462) 
     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1462) 
     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1462) 
     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1462) 
     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1462) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1898) 
     at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1375) 
     at android.app.Activity.dispatchKeyEvent(Activity.java:2356) 
     at com.actionbarsherlock.app.SherlockFragmentActivity.dispatchKeyEvent(SherlockFragmentActivity.java:122) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1825) 
     at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3585) 
     at android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:3555) 
     at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2805) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:213) 
     at android.app.ActivityThread.main(ActivityThread.java:4787) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 
     at dalvik.system.NativeStart.main(Native Method) 

Irgendwelche Ideen?

+0

Mögliche Duplikat [Android, Listview Illegal: „Der Inhalt des Adapters geändert hat, aber Listview nicht erhalten eine Benachrichtigung“] (http://stackoverflow.com/questions/3132021/android-listview-illegalstateexception-der-content-des-adapter-hat-geändert – rds

Antwort

1

versuchen Sie, dass in ui Thread

runOnUiThread(new Runnable(){ 
     public void run() { 
      mListAdapter.notifyDataSetChanged(); 
     } 
    }); 
+0

Aber onPostExecute soll auf dem UI-Thread schon richtig laufen? (Ill aber hinzufügen und überprüfen Sie auch, ob es meine Probleme löst.) –

+0

Nur überprüft, keine Änderung. Ich bekomme immer noch die gleiche Ausnahme, wenn Aktivität B schließt und onResume heißt –

+0

Ja, es ist seltsam. Haben Sie überprüft, ob neue Daten gültig sind? – thealeksandr

Verwandte Themen