2012-08-27 3 views
5

ich das gemeinsame Problem habe:Android Affe verursacht Adapter Benachrichtigung Ausnahme in android.widget.HeaderViewListAdapter

java.lang.IllegalStateException: The content of the adapter has changed but List 
View did not receive a notification. Make sure the content of your adapter is no 
t modified from a background thread, but only from the UI thread. [in ListView(2 
131427573, class android.widget.ListView) with Adapter(class android.widget.Head 
erViewListAdapter)] 

Aber der Adapter ist nicht mein Code, aber in android.widget.HeaderViewListAdapter Dies geschieht mit Jellybean.

Ich lese den Quellcode von HeaderViewListAdapter, ListAdapter und ListView. Die IllegalStateException ausgelöst wird, wenn die Elementanzahl in ListView auf die Zählung durch die ListAdapter bereitgestellt nicht gleich ist. In diesem Fall ist die ListAdapter die HeaderViewListAdapter. Der Wert HeaderViewListAdapter s ist die Anzahl der ursprünglichen ListAdapter, die vom Clientcode übergeben wurden, zuzüglich der Größe der Kopf- und Fußzeile.

ich durch meinen Code verfolgt. Der gesamte Zugriff auf die ListView ist auf dem UI-Thread und wird immer von notifyDataSetChanged() an den Adapter gefolgt. Ich benutze eine Fußzeile.

auftritt Dies auch im normalen Betrieb nicht. Liegt es an Monkey? Aber wie kann Monkey meine Variablen von anderen Threads modifizieren?

  • Update nach mehr Affen Testing

entfernte ich die Fußzeile durch den Anruf zu addFooterView() entfernen. Monkey löst die Ausnahme nicht mehr aus. Sollte ich den Anruf zu addFooterView() irgendwann entfernen?

+0

Bitte, bitte sagen Sie mir, dass Sie eine Lösung gefunden haben! – StErMi

+0

Ich habe das gleiche Problem, aber es passiert auch außerhalb Affen Verwendung. Ich kann das Problem nicht reproduzieren und oft wiederhole Monkey ohne Fehler nach 20K Iterationen. – StErMi

+0

Entschuldigung, ich habe keine Lösung gefunden. Allerdings habe ich dieses Problem nicht außerhalb des Affen gesehen. – mparaz

Antwort

9

Sie versuchen, etwas zu Ihrem Listview können das Hinzufügen:

@Override 
protected void layoutChildren() { 
    try { 
     super.layoutChildren(); 
    } catch (IllegalStateException e) { 
     ZLog.e(LOG, "This is not realy dangerous problem"); 
    } 
} 

Wenn Sie eine Kopfansicht oder eine Fußleiste ListView hinzufügen und wenn notifyDataSetChanged(), wird die MItemCount in die Elementanzahl des realen Adapters ändern, aber die rechte Seite wird die gefälschte Elementzahl zurückgeben, die die Kopf- und Fußzeile hinzugefügt hat.

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/widget/ListView.java?av=f#1538

+0

Danke. Ich habe aufgehört, an diesem Projekt zu arbeiten (wie vor einem halben Jahr). Glauben Sie, dass es keine Nebenwirkungen gibt, wenn Sie diese Ausnahme ignorieren? – mparaz

+0

Meiner Meinung nach ist das Android-Bug, also nein. –

1

werde ich mein eigentliches Problem erklären. Bei Bedarf werde ich auch etwas Code anhängen.

Das Szenario ist folgendes: Ich habe eine EndlessList erstellt die Liste auf eine OnScrollListener befestigen. Wenn ich das Ende der Liste erreiche, starte ich eine AsyncTask (wenn Daten zu laden sind).

Im PreExecute füge ich in die Fußzeile eine Ansicht (Spinner). Im doInBackground lade ich Daten aus dem Internet und in der onPostExecute füge ich Daten zum Adapter hinzu und entferne die Fußzeile View (das Lade-Spinner). Sie müssen es entfernen, da Sie nicht auf diese Ansicht zugreifen und es auf GONE setzen können.

In meinem Code ich nie einen notifyDataSetChange weil in den Adapter (ArrayAdapter, die ich von JB Quellcode geklont haben), wenn Sie eine addAll tun es automatisch tun es

/** 
* Adds the specified Collection at the end of the array. 
* 
* @param collection The Collection to add at the end of the array. 
*/ 
public void addAll(Collection<? extends T> collection) { 
    synchronized (mLock) { 
     if (mOriginalValues != null) { 
      mOriginalValues.addAll(collection); 
     } else { 
      mObjects.addAll(collection); 
     } 
    } 
    if (mNotifyOnChange) notifyDataSetChanged(); 
} 

Es funktioniert gut, aber manchmal es mit diesem verdammten Fehler zum Absturz bringen und ich habe keine Ahnung, es zu lösen:

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(16908298, class android.widget.ListView) with Adapter(class android.widget.HeaderViewListAdapter)] 
    at android.widget.ListView.layoutChildren(ListView.java:1545) 
    at android.widget.AbsListView.onTouchModeChanged(AbsListView.java:2239) 
    at android.view.ViewTreeObserver.dispatchOnTouchModeChanged(ViewTreeObserver.java:591) 
    at android.view.ViewRoot.ensureTouchModeLocally(ViewRoot.java:2122) 
    at android.view.ViewRoot.ensureTouchMode(ViewRoot.java:2106) 
    at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2216) 
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1886) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3687) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
    at dalvik.system.NativeStart.main(Native Method) 
+0

hast du eine Lösung dafür gefunden? – Michael

+0

nein, ich warte auf eine offizielle Antwort von Android-Team :) – StErMi

+0

überprüfen Sie, ob Sie die Listendaten in der ui-Thread ändern, wenn es nicht abstürzen wird. – Michael

1

Ich weiß, ihr eine späte Antwort .... aber ich gerade diesen Fehler vor kurzem bekam .... Ich war mit android-amazing-listview.Und ich bin immer der gleiche Fehler endete mit

(class android.widget.HeaderViewListAdapter)]). 

Lösung, die für mich arbeiten is->

ich denke, das Problem rührt von der Tatsache, dass getAdapter kehrt die AmazingAdapter anstelle der umschlossenen HeaderListViewAdapter verursacht manchmal ein Unterschied in der Anzahl. Ich habe einfach die Methode getAdapter aus AmazingListView entfernt und seitdem keine Ausnahme mehr.

+0

Danke für die Freigabe. Ich arbeite nicht mehr mit Android ... Und sie haben es immer noch nicht behoben, so scheint es! – mparaz

+0

Die Lösungen, die ich erwähnt habe, reparierten es für mich..so ich dachte, es zu teilen ... Danke. –

Verwandte Themen