Обезьяна 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.

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

Я знаю, что это поздний ответ.... но я только что получил эту ошибку недавно.... Я использовал 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)
Другие вопросы по тегам