Я интегрировал 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.
Заранее спасибо :)