CommonsGuy EndlessAdapter中的java.lang.IllegalStateException

时间:2012-10-26 20:37:47

标签: android android-listview listadapter commonsware-cwac

我正在将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的进度指示项时才会生成异常。

提前致谢:)

1 个答案:

答案 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

的实施