5

Czytałem dużo o tym na SO, ale nie mogłem znaleźć rozwiązania w moim przypadku. Oto konfiguracja:Zawartość adaptera zmieniła się, ale ListView nie otrzymał powiadomienia, nic nie zaktualizowano w tle.

Aktywność A, zawiera listę i wyświetlane dane. Kiedy zadanie asynchroniczny mój menedżer dane dotyczą zakończy aktualizację dodaje się dzieje:

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(); 
     } 
    } 

Gdy dane zostaną zaktualizowane, aktywność dostaje zwrotnego i wykonuje następujące operacje:

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

Mdata jest ArrayList zawierającą wszystkie "rows" i mDataSectionCount to int [] zawierające informacje o tym, jak mData powinno być podzielone na sekcje.

Aktywność A ma teraz menu opcji, które może otworzyć drugie działanie. Aktywność B.

Co jakiś czas po uruchomieniu Monkey i Activity B kończy się. Moja onResume na aktywność A pobiera nazywane:

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

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

    this.invalidateOptionsMenu(); 
} 

(updateData tylko pożary mego AsyncTask jeśli jej jeszcze nie działa), a następnie gówno uderza wentylator ...:

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) 

pomysłów?

+0

Możliwy duplikat [Android, ListView IllegalStateException: „Zawartość karty nie zmieniło, ale ListView nie otrzymała zgłoszenie”] (http://stackoverflow.com/questions/3132021/android-listview-illegalstateexception-the-content-of-the-adapter-has-changed) – rds

Odpowiedz

1

spróbować zrobić w wątku UI

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

Ale onPostExecute ma działać poprawnie na wątku UI? (Zły jednak dodaj to i sprawdź też, czy to rozwiąże moje problemy.) –

+0

Właśnie sprawdziłem, bez zmian. Nadal otrzymuję ten sam wyjątek, gdy działanie B zamyka się, a onResume jest nazywane –

+0

Tak, to dziwne. Czy sprawdziłeś, czy nowe dane są prawidłowe? – thealeksandr