我正在将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项与ListViewgetCount()方法之间存在某种关系,因为仅当单击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/

10-11 20:05