Обезьяна Android вызывает исключение уведомления адаптера в 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)]
Но адаптер не мой код, а в android.widget.HeaderViewListAdapter
Это использует желе.
Я прочитал исходный код HeaderViewListAdapter
, ListAdapter
а также ListView
, IllegalStateException
выбрасывается, когда количество предметов вListView
не равно количеству, предоставленному ListAdapter
, В этом случае ListAdapter
это HeaderViewListAdapter
, HeaderViewListAdapter
счетчик является счетчиком оригинала ListAdapter
переданный клиентским кодом, плюс размер верхнего и нижнего колонтитула.
Я проследил через мой код. Весь доступ к ListView
находится в потоке пользовательского интерфейса и всегда сопровождается notifyDataSetChanged()
к адаптеру. Я использую один нижний колонтитул.
Это не происходит при нормальном использовании. Это из-за Обезьяны? Но как Monkey может изменять мои переменные из других потоков?
- Обновление после более Обезьяны Тестирование
Я удалил нижний колонтитул, удалив вызов addFooterView()
, Обезьяна больше не вызывает исключение. Должен ли я удалить звонок addFooterView()
в какой-то момент?
3 ответа
Вы можете попробовать добавить что-то вроде этого в свой ListView:
@Override
protected void layoutChildren() {
try {
super.layoutChildren();
} catch (IllegalStateException e) {
ZLog.e(LOG, "This is not realy dangerous problem");
}
}
Если вы добавляете представление заголовка или нижнего колонтитула ListView и когда вы уведомляете DataDetSetChanged(), он изменит mItemCount на счетчик элементов реального адаптера, но правая сторона возвратит поддельный itemcount, который добавил заголовочный и footercount.
Я знаю, что это поздний ответ.... но я только что получил эту ошибку недавно.... Я использовал android-amazing-listview. И я получаю ту же ошибку, закончившуюся
(class android.widget.HeaderViewListAdapter)]).
Решение, которое работает для меня ->
Я думаю, что это связано с тем, что getAdapter
возвращает AmazingAdapter
вместо завернутого HeaderListViewAdapter
вызывая разницу в количестве в разы. Я просто удалил метод getAdapter из AmazingListView и с тех пор не получил исключения.
Я объясню мою актуальную проблему. При необходимости я также приложу некоторый код.
Сценарий таков: я создал EndlessList, присоединяющий список к OnScrollListener. Когда я достигаю конца списка, я запускаю AsyncTask (если есть данные для загрузки).
В preExecute я добавляю в нижний колонтитул представление (счетчик). В doInBackground я получаю данные из интернета, а в onPostExecute добавляю данные в адаптер и удаляю вид нижнего колонтитула (загрузочный счетчик). Вы должны удалить его, потому что вы не можете получить доступ к этому представлению и положить его в GONE.
В моем коде я никогда не делаю notifyDataSetChange, потому что в адаптере (ArrayAdapter, который я клонировал из исходного кода JB), когда вы делаете addAll, он автоматически делает это
/**
* 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();
}
Это работает хорошо, но иногда это терпит крах с этой чертовой ошибкой, и я понятия не имею, чтобы решить это:
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)