2

我正在将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

步骤 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

ListView2)点击item和getCount()method有一定的关系,ListView因为它只有在点击ListView的进度条时才会产生Exception。

提前致谢 :)

4

1 回答 1

1

感谢您为此问题提供可重现的测试用例。我进行了两项更改以EndlessAdapter尝试解决该问题,包括合并您上面概述的areAllItemsEnabled()/ fix 的变体。isEnabled()这已提交并标记为 v1.2。如果并且当您迁移到库的 v1.2 时,您将需要删除自己对areAllItemsEnabled()和的覆盖isEnabled()

为什么只有当我希望自己的 AsyncTask 实现缓存数据时 EndlessAdapter 实现才会引发异常,即 endlessAdapter.setRunInBackground(false); 但不是在使用 neverAdapter.setRunInBackground(true); 没有 AsyncTask 的自定义实现

异常通过 提供给您onException(),您可以覆盖它。这是为了确保您在主应用程序线程上获得异常,即使异常可能是由EndlessAdapter.

点击ListView项和ListView的getCount()方法有一定的关系,因为只有在点击ListView的进度条时才会产生异常。

这是在实施中ListView

于 2012-10-27T07:01:42.173 回答