首先看一下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。

Android中notifyDataSetInvalidated()和notifyDataSetChanged()相关推荐

  1. Android中notifyDataSetInvalidated()和notifyDataSetChanged()有什么区别

      看下源码中对于这两个方法   public void notifyDataSetChanged () 该方法内部实现了在每个观察者上面调用onChanged事件.每当发现数据集有改变的情况,或者读 ...

  2. android notifydatasetchanged 刷新错误,Android中适配器的notifyDataSetChanged()为何有时不刷新...

    学过Android开发的人都知道,ListView控件在开发中经常遇到,并且ListView通常结合Adapter适配器来进行数据显示和数据更新操作.姑且假设数据存储在名为dataList的成员变量中 ...

  3. Android记录15--关于ListView中adapter调用notifyDataSetChanged无效的原因

    Android记录15--关于ListView中adapter调用notifyDataSetChanged无效的原因 2014年1月16日 开发记录 话说这个问题已经困扰我很久了,一直找不到原因,我以 ...

  4. Android中关于notifyDataSetChanged()方法的注意

    1.首先介绍下notifyDataSetChanged()方法的原理 notifyDataSetChanged方法原理 2.介绍下我在此处犯的错误 public class HomeFragment ...

  5. BaseAdapter 的notifyDataSetInvalidated 和notifyDataSetChanged

    写了一年的多的android代码,都没有明白notifyDataSetInvalidated 和notifyDataSetChanged是什么原理. 今天就来好好了解. 我们一直以来,在listVie ...

  6. Android中的网络(字节跳动)

    文章目录 RESTful API 对REST的解释 资源与URI 什么是URI HTTP URL的组成 Http 接口 JSON Http资源 XML JSON Android中对JSON的处理 方法 ...

  7. Android中图片的三级缓存策略

    在开发过程中,经常会碰到进行请求大量的网络图片的样例.假设处理的不好.非常easy造成oom.对于避免oom的方法,无非就是进行图片的压缩.及时的回收不用的图片.这些看似简单可是处理起来事实上涉及的知 ...

  8. android listview 数据同步,android中ListView数据刷新时的同步方法

    本文实例讲述了android中ListView数据刷新时的同步方法.分享给大家供大家参考.具体实现方法如下: public class Main extends BaseActivity { priv ...

  9. android json 解析图片,JSON解析并获取android中的图像

    我想解析包含字符串和图像的JSON对象.我的代码正在工作,但它加载图像太慢.我想加载另一个asynctask或服务的图像,以减少加载时间.我怎样才能做到这一点?哪一个是最好的方法使用asynctask ...

最新文章

  1. Android HAL模块的加载过程
  2. SpringSecurity的简单应用(一)
  3. 第 3 章 kickstart
  4. JavaWeb(七)——Cookie、Session
  5. 共模电感适用的频率_分析共模电感和差模电感寄生电容抵消的方法
  6. python自带的sum()函数和numpy库中的sum()函数的区别
  7. python中分割字符串两种方法正则分组别名,如何在python中使用正则表达式模块将文本字符串分割成单词?...
  8. 添加class值_Java 虚拟机(二) - Class 文件结构
  9. jsp+servlet+mysql简单实现用户登陆注册
  10. elementui回到顶部Backtop
  11. class CText{}; CText t; int const CText::*p; 什么意思?
  12. 表贴电阻尺寸与什么有关_贴片电阻简介:功率大小与尺寸对应表
  13. 参加第八届中国软件杯大学生软件设计大赛如何准备?以课工场为例!
  14. 数据结构-链表-环形链表
  15. 国内10个千年古镇 绝美春色洗涤你的眼
  16. Matlab的一些术语
  17. 阿里云OSS文件上传,后台签名方案
  18. Mapbox可视化之填色图
  19. 《一个人的朝圣》—— 读后总结
  20. PUCCH(3)matlab验证ZC序列的性质

热门文章

  1. neo4j报错1:因CREATE和MERGE报错
  2. linux配置usb主从_基于Linux的USB主/从设备之间的三种通信方式
  3. 用友T+“常用存货属性”
  4. MVC框架的学习总结
  5. 爬取12306站点信息
  6. 【NLP】pyltp工具介绍、安装和使用代码+示例
  7. 艾恩技术access sql asp
  8. | + logger
  9. C语言中fscanf函数
  10. 零基础教程-如何快速将EXCEL表格数据拆分成多个文件