我正在将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
实现缓存数据(在EndlessAdapter类的AsyncTask
方法中执行cacheInBackground()
)时。
重新创建此IllegalStateException的步骤:
步骤1)运行作为EndlessAdapterCustomTaskFragment
演示提供的EndlessAdapter
example
步骤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);
且没有自定义实现的情况下却不抛出异常2)单击
AsyncTask
项与ListView
的getCount()
方法之间存在某种关系,因为仅当单击ListView的进度指示器项时,它才会生成异常。提前致谢 :)
最佳答案
感谢您提供此问题的可重现测试用例。为了解决此问题,我对EndlessAdapter
进行了两项更改,包括并入您上面概述的areAllItemsEnabled()
/ isEnabled()
修复程序的变体。这已经提交并标记为v1.2。如果并且当您移至库的v1.2时,您将需要删除自己的areAllItemsEnabled()
和isEnabled()
替代。
为什么EndlessAdapter实现仅在我希望自己的AsyncTask实现缓存数据时抛出异常,即endlessAdapter.setRunInBackground(false);?但是在使用endlessAdapter.setRunInBackground(true)时不可以;没有AsyncTask的自定义实现
异常是通过onException()
提供给您的,您可以覆盖它。这是为了确保即使在EndlessAdapter
管理的后台线程中引起异常时,也可以在主应用程序线程上获得异常。
单击ListView项目与ListView的getCount()方法之间存在某种关系,因为仅当单击ListView的进度指示器项目时,它才会生成异常。
这是在ListView
的实现中。
关于android - CommonsGuy EndlessAdapter中的java.lang.IllegalStateException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13094094/