Android中notifyDataSetInvalidated()和notifyDataSetChanged()

首先看一下notifyDataSetChanged与notifyDataSetInvalidated的区别:
我们打开官方的源码:

 /**
     * Notifies the attached observers that the underlying data has been changed
     * and any View reflecting the data set should refresh itself.
     */
    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }

    /**
     * Notifies the attached observers that the underlying data is no longer valid
     * or available. Once invoked this adapter is no longer valid and should
     * not report further data set changes.
     */
    public void notifyDataSetInvalidated() {
        mDataSetObservable.notifyInvalidated();
    }

我给大家大概翻译一下官方的英文:
notifyDataSetChanged():通知数据观察者当前所关联的数据源已经发生了改变,任何与该数据有关的视图都应该去刷新自己。
notifyDataSetInvalidated():通知数据观察者当前所关联的数据源已经无效或者不能获得了,一旦触发了这个方法当前的adapter就变得无效了,也不应该报告自己的数据改变了。

虽然翻译了一遍,但好像还是不是很懂,这两个方法到底有啥不同呢,下面就用通俗易懂的话来解释一下:
其实两个方法都可以实现在数据源改变后刷新界面,效果上是一样的。

我们可应用粮仓来解释一下,两者的区别。
notifyDataSetChanged:粮仓中得粮食少了,或者多了,发送通知。
notifyDataSetInvalidated:粮仓变换了,比如原来从A仓取粮食,现在换成了B粮仓

有时候在开发中我们会遇到这两种方法不起作用的问题,下面讲讲为什么会发生这种情况:

还是用粮仓来做比喻吧。
设有粮仓A,我们需要把A中得粮食,显示出来。
然后,某天运输队,运来了一批粮食,这批粮食有两种方式存储。
1.把粮食放到A中,也就是我们说得List的Add方法。
2.新建一个粮仓B,把粮食放入B粮仓中。就是代码中,new List —>add.

就这两种情况分析一下,为什么不起作用。

第一种,如果使用notifyDataSetInvalidated,是不会起作用的,因为数据源没有变化,就是粮仓还在。这个时候应该使用notifyDataSetChanged。粮仓中得粮食变了。

第二种,这是最复杂的,大部分不起作用都发生在这种情况下。

分析:notifyDataSetChanged不起作用的原因,是因为A粮仓中粮食没有发生变化。Adapter中仍然保持是对A粮仓的地址引用。

notifyDataSetInvalidated不起作用的原因,是因为,Adapter中得变量仍然是保持对A的引用,没有改变引用地址。

解决方法:第一种情况,基本不会出问题。
主要是第二种:如果数据对象,是重新new的对象,我们需要把对象的引用赋值给要显示的List,然后通知Adapter数据源发生了变化。比如重新setList(),并使用notifyDataSetInvalidated。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值