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
,