我正在将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
}在EndlessAdapter类的cacheInBackground()
方法中。
重新创建此IllegalStateException的步骤:
步骤1)运行EndlessAdapterCustomTaskFragment
{/ 3}}作为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的进度指示项时才会生成异常。
提前致谢:)
答案 0 :(得分:1)
感谢您为此问题提供可重现的测试用例。我对EndlessAdapter
进行了两处更改,以尝试解决此问题,包括合并上面列出的areAllItemsEnabled()
/ isEnabled()
修正的变体。这已被提交并标记为v1.2。如果您移至库的v1.2,则需要删除自己的areAllItemsEnabled()
和isEnabled()
覆盖。
为什么EndlessAdapter实现仅在我希望自己的AsyncTask实现缓存数据时抛出异常,即endlessAdapter.setRunInBackground(false);但是当使用endlessAdapter.setRunInBackground(true)时;没有AsyncTask的自定义实现
您可以通过onException()
提供例外,您可以覆盖该例外。这是为了确保您在主应用程序线程上获得异常,即使在EndlessAdapter
管理的后台线程中可能导致异常。
单击ListView项和ListView的getCount()方法之间存在某种关系,因为只有在单击ListView的进度指示项时才生成Exception。
这是ListView
。