java.lang.IllegalStateException в CommonsGuy EndlessAdapter

Я интегрировал commonsguy/cwac-endless EndlessAdapter в одно из своих приложений, и это сработало очень здорово! Спасибо сэру CommonsWare :)

Но я получаю java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification.

Примечание. Это исключение возникает только тогда, когда я использую endlessAdapter.setRunInBackground(false);, в основном, когда я хочу, чтобы моя собственная реализация AsyncTask кэшировала данные (выполнение AsyncTask в методе cacheInBackground() класса EndlessAdapter).

Действия по воссозданию этого исключения IllegalStateException:

Шаг 1) Запустите EndlessAdapterCustomTaskFragment пример представлен в качестве демонстрации для EndlessAdapter

Шаг 2) Прокрутите ListView вниз, чтобы просмотреть прогресс.

Шаг 3) Нажмите на представление прогресса. Теперь после нажатия на представление прогресса во время загрузки данных приложение будет принудительно закрыто с помощью java.lang.IllegalStateException.

Чтобы решить эту проблему, я переопределил следующие методы класса EndlessAdapter, и это действительно сработало ;)

    @Override
    public boolean areAllItemsEnabled() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean isEnabled(int position) {
        // TODO Auto-generated method stub
        return getItem(position) != null;
    }

Мне очень интересно узнать о следующем:

1) Почему реализация EndlessAdapter выдает исключение только тогда, когда я хочу, чтобы моя собственная реализация AsyncTask кэшировала данные, т.е. endlessAdapter.setRunInBackground(false);, НО НЕ при использовании endlessAdapter.setRunInBackground(true); без пользовательской реализации AsyncTask

2) Существует некоторая связь между щелчком элемента ListView и методом getCount() элемента ListView, поскольку он генерирует исключение только при нажатии элемента индикатора выполнения ListView.

Заранее спасибо :)


person Vishal Vyas    schedule 26.10.2012    source источник


Ответы (1)


Спасибо за предоставление воспроизводимого теста для этой проблемы. Я внес два изменения в EndlessAdapter, чтобы попытаться решить проблему, в том числе включил вариант исправления areAllItemsEnabled()/isEnabled(), описанного выше. Это было зафиксировано и помечено как v1.2. Если и когда вы перейдете к версии 1.2 библиотеки, вам нужно будет удалить собственные переопределения areAllItemsEnabled() и isEnabled().

Почему реализация EndlessAdapter выдает исключение только тогда, когда я хочу, чтобы моя собственная реализация AsyncTask кэшировала данные, т.е. НО НЕ при использовании endAdapter.setRunInBackground(true); без пользовательской реализации AsyncTask

Исключение предоставляется вам через onException(), которое вы можете переопределить. Это делается для того, чтобы вы получили исключение в основном потоке приложения, даже если исключение может быть вызвано фоновым потоком, управляемым EndlessAdapter.

Существует некоторая связь между щелчком элемента ListView и методом getCount() ListView, поскольку он генерирует исключение только при нажатии элемента индикатора выполнения ListView.

Это в реализации ListView.

person CommonsWare    schedule 27.10.2012
comment
Спасибо за ваш ответ. Также я нашел еще одну ошибку в вашей реализации EndlessAdapter. - person Vishal Vyas; 27.10.2012