2012-08-27 8 views
5

Mam wspólny problem:Android małpa powoduje wyjątek powiadomienia adapter w 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)] 

Ale adapter nie jest mój kod, ale w android.widget.HeaderViewListAdapter ten korzysta Jellybean.

Przeczytałem kod źródłowy HeaderViewListAdapter, ListAdapter i ListView. Numer IllegalStateException jest wyświetlany, gdy liczba elementów w ListView nie jest równa liczbie podanej przez ListAdapter. W tym przypadku ListAdapter to HeaderViewListAdapter. Liczba HeaderViewListAdapter to liczba oryginalnych ListAdapter przekazywanych przez kod klienta, plus rozmiar nagłówka i stopki.

Przeszukałem mój kod. Cały dostęp do ListView znajduje się w wątku UI i zawsze następuje do adaptera notifyDataSetChanged(). Używam jednej stopki.

Nie występuje to przy normalnym użytkowaniu. Czy to ze względu na Monkey? Ale jak Monkey może modyfikować moje zmienne z innych wątków?

  • Aktualizacja po więcej Monkey Testing

usunąłem stopkę usuwając wezwanie do addFooterView(). Małpa nie uruchamia już wyjątku. Czy powinienem w pewnym momencie usunąć połączenie z addFooterView()?

+0

Proszę, proszę mi powiedzieć, że znalazłeś rozwiązanie! – StErMi

+0

Mam ten sam problem, ale zdarza się to również poza używaniem małpy. Nie mogę odtworzyć problemu i wiele razy Monkey kończy bez błędu po iteracjach 20K. – StErMi

+0

Niestety, nie znalazłem rozwiązania. Jednak nie widziałem tego problemu poza używaniem małp. – mparaz

Odpowiedz

9

można spróbować dodać coś takiego do ListView:

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

Jeśli dodasz widok nagłówkowy lub stopkę ListView, a po powiadomieniuDataSetChanged(), zmieni ona wartość mItemCount na liczbę rzeczywistych elementów adaptera, ale prawa strona zwróci fałszywy numer artykułu, który dodał wartość headercount i footercount.

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

Dzięki. Przestałem pracować nad tym projektem (jak to było pół roku temu). Czy uważasz, że nie ma żadnych skutków ubocznych, po prostu ignorując ten wyjątek? – mparaz

+0

Moim zdaniem jest to błąd Androida, więc nie. –

1

Wyjaśnię mój faktyczny problem. W razie potrzeby dołączę również kod.

Scenariusz jest taki: Stworzyłem EndlessList dołączając listę do OnScrollListener. Po dojściu do końca listy uruchamiam AsyncTask (jeśli są dane do załadowania).

W preExutute dodaję do stopki widok (spinner). Na doInBackground pobieram dane z Internetu, a onPostExecute dodaję dane do adaptera i usuwam Widok stopki (spinner ładujący). Musisz go usunąć, ponieważ nie możesz uzyskać dostępu do tego widoku i umieścić go w pozycji GONE.

W moim kodu nigdy nie robię notifyDataSetChange bo w adapterze (ArrayAdapter że mam sklonowanego z kodu źródłowego JB), kiedy zrobić AddAll automatycznie zrobić to

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

To działa dobrze, ale czasami zawiesisz z tym cholernym błędzie i nie mam pojęcia, aby go rozwiązać:

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

znalazłeś rozwiązanie dla tego? – Michael

+0

nie, czekałem na oficjalną odpowiedź od zespołu Androida :) – StErMi

+0

sprawdź czy modyfikujesz dane listy w wątku interfejsu, jeśli nie, to się zawiesi. – Michael

1

Znam jego opóźnienie w odpowiedzi .... ale ja właśnie ten błąd niedawno .... używałem android-amazing-listview.A ja otrzymuję ten sam błąd zakończył

(class android.widget.HeaderViewListAdapter)]). 

rozwiązanie, które pracują dla mnie jest->

myślę, że to zagadnienia wynika z faktu, że getAdapter jest zwrócenie AmazingAdapter zamiast zawiniętego HeaderListViewAdapter powodując różnica w liczeniu w czasie. Po prostu usunąłem metodę getAdapter z AmazingListView i nie mam od tego czasu wyjątku.

+0

Dzięki za udostępnienie. Nie pracuję już nad Androidem ... I nadal nie naprawili tego, wydaje się! – mparaz

+0

Rozwiązania, o których wspomniałem, naprawiły to dla mnie ... więc pomyślałem, że mogę je udostępnić ... Dzięki. –

Powiązane problemy