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。
Android中notifyDataSetInvalidated()和notifyDataSetChanged()相关推荐
- Android中notifyDataSetInvalidated()和notifyDataSetChanged()有什么区别
看下源码中对于这两个方法 public void notifyDataSetChanged () 该方法内部实现了在每个观察者上面调用onChanged事件.每当发现数据集有改变的情况,或者读 ...
- android notifydatasetchanged 刷新错误,Android中适配器的notifyDataSetChanged()为何有时不刷新...
学过Android开发的人都知道,ListView控件在开发中经常遇到,并且ListView通常结合Adapter适配器来进行数据显示和数据更新操作.姑且假设数据存储在名为dataList的成员变量中 ...
- Android记录15--关于ListView中adapter调用notifyDataSetChanged无效的原因
Android记录15--关于ListView中adapter调用notifyDataSetChanged无效的原因 2014年1月16日 开发记录 话说这个问题已经困扰我很久了,一直找不到原因,我以 ...
- Android中关于notifyDataSetChanged()方法的注意
1.首先介绍下notifyDataSetChanged()方法的原理 notifyDataSetChanged方法原理 2.介绍下我在此处犯的错误 public class HomeFragment ...
- BaseAdapter 的notifyDataSetInvalidated 和notifyDataSetChanged
写了一年的多的android代码,都没有明白notifyDataSetInvalidated 和notifyDataSetChanged是什么原理. 今天就来好好了解. 我们一直以来,在listVie ...
- Android中的网络(字节跳动)
文章目录 RESTful API 对REST的解释 资源与URI 什么是URI HTTP URL的组成 Http 接口 JSON Http资源 XML JSON Android中对JSON的处理 方法 ...
- Android中图片的三级缓存策略
在开发过程中,经常会碰到进行请求大量的网络图片的样例.假设处理的不好.非常easy造成oom.对于避免oom的方法,无非就是进行图片的压缩.及时的回收不用的图片.这些看似简单可是处理起来事实上涉及的知 ...
- android listview 数据同步,android中ListView数据刷新时的同步方法
本文实例讲述了android中ListView数据刷新时的同步方法.分享给大家供大家参考.具体实现方法如下: public class Main extends BaseActivity { priv ...
- android json 解析图片,JSON解析并获取android中的图像
我想解析包含字符串和图像的JSON对象.我的代码正在工作,但它加载图像太慢.我想加载另一个asynctask或服务的图像,以减少加载时间.我怎样才能做到这一点?哪一个是最好的方法使用asynctask ...
最新文章
- Android HAL模块的加载过程
- SpringSecurity的简单应用(一)
- 第 3 章 kickstart
- JavaWeb(七)——Cookie、Session
- 共模电感适用的频率_分析共模电感和差模电感寄生电容抵消的方法
- python自带的sum()函数和numpy库中的sum()函数的区别
- python中分割字符串两种方法正则分组别名,如何在python中使用正则表达式模块将文本字符串分割成单词?...
- 添加class值_Java 虚拟机(二) - Class 文件结构
- jsp+servlet+mysql简单实现用户登陆注册
- elementui回到顶部Backtop
- class CText{}; CText t; int const CText::*p; 什么意思?
- 表贴电阻尺寸与什么有关_贴片电阻简介:功率大小与尺寸对应表
- 参加第八届中国软件杯大学生软件设计大赛如何准备?以课工场为例!
- 数据结构-链表-环形链表
- 国内10个千年古镇 绝美春色洗涤你的眼
- Matlab的一些术语
- 阿里云OSS文件上传,后台签名方案
- Mapbox可视化之填色图
- 《一个人的朝圣》—— 读后总结
- PUCCH(3)matlab验证ZC序列的性质