代码之家  ›  专栏  ›  技术社区  ›  Tawani

android-adapter.notifydatasetinvalidated是做什么的?

  •  29
  • Tawani  · 技术社区  · 14 年前

    方法adapter.notifyDataSetinvalidated()完成了什么? 上面没有文档。

    我正在尝试重新加载ListView,而notifyDataSetChanged或notifyDataSetInvalidated似乎无法完成任何操作。

    4 回复  |  直到 11 年前
        1
  •  26
  •   Cristian    14 年前

    这取决于适配器实现…如果您查看源代码,您将看到:

    1. notifyDataSetInvalidated() 调用 notifyInvalidated() DataSetObservable 类( see here )
    2. 然后, 通知无效() 调用 onInvalidated() 每种方法 DataSetObserver ( see here )
    3. 接下来是有趣的部分: 无效的() does not do anything

    这是它的实现:

    public void onInvalidated() {
        // Do nothing
    }
    

    数据集观察器 是一个抽象类,所以由子类决定要做什么 无效的() .

        2
  •  28
  •   Donut    12 年前

    据我所知, notifyDataSetInvalidated() 方法阻止适配器访问数据(如果数据无效、不可用等)。这个 notifyDataSetChanged() 方法更新 ListView 因此,您可以看到添加的新数据,但必须在UI线程中调用它。

    它帮了我很大的忙 this video --有两个部分会提到这些方法并解释如何正确使用它们。也许这对你也有帮助:)

        3
  •  18
  •   Tony Chan    13 年前

    我最近碰到这个问题,想为那些以编程方式想知道你打电话时发生了什么事情的人详细说明一下。 notifyDataSetChanged() notifyDataSetInvalidated() . *简短回答,开始 here

    正如@cristian在他的回答中所说,当您在适配器上调用这些notify方法时,它基本上通过几个类调用,最后调用 onChanged() / onInvalidated() 在注册的 DataSetObserver S用于适配器。

    如果你遵循代码,你会看到 DataSetObserver 如前所述是抽象的,并且 OnCudid() / 无效的() 方法为空,等待子类实现。

    如果这是故事的结尾,那么为什么Android框架工程师总是告诉我们,如果他们什么都不做,为什么要调用这些方法呢?这需要一些挖掘,但事实证明这已经是一个子类了 数据集观察器 打电话 AdapterDataSetObserver 它生活在抽象的课堂上 AdapterView (通过类 GridView ListView )当您 setAdapter() 对你 适应视图 得到 registered 到适配器。

    在这里,你可以看到这些方法实际上做的所有疯狂的事情。文档不好,起初我认为我需要注册自己的子类 数据集观察器 为了让这些功能正常运行,但事实证明已经为您创建了一个。

    *一些我认为有用的东西:我相信你可以注册多个 数据集观察器 到适配器(除了默认适配器)。如果需要的话,这将允许您做一些额外的工作(比如在下载位图后,可以将进度条视图与图像视图交换)。

        4
  •  3
  •   android developer    11 年前

    根据 the world of listView “在讲座中,每次ListView没有要显示的内容(意味着空数据)时都应该使用它。

    他们讨论的一个例子是当过滤完成时(在“PublishResults”方法上)。在演讲视频上,是36:00。

    奇怪的是,他们为什么不把它和notifydatasetchanged合并,后者可以检查项目的数量并决定自己调用它…

    根据我所看到的,演讲中所说的并不完全正确。如果适配器以前显示过某些内容,但现在不包含任何内容,现在您调用notifydatasetinvalidated,则不会发生任何情况,因此内容将保留,因此我认为只有在数据不变时才使用notifydatasetinvalidated是安全的。

    例如,如果您处理筛选,并且获得与以前相同的结果(并且可能足以检查结果的数量),则可以调用notifydatasetinvalidated而不是notifydatasetchanged。