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.

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

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам