论Android Adapter notifyDataSetChanged与notifyDataSetInvalidated无效原因
来源:互联网 发布:知乎手机版怎么引用 编辑:程序博客网 时间:2024/05/22 12:41
最近在开发中遇到一个问题,Adapter中使用notifyDataSetChanged 与notifyDataSetInvalidated无效,经过思考和网上查找,得出如下原因。
首先看一下notifyDataSetChanged与notifyDataSetInvalidated的区别
我们可应用粮仓来解释一下,两者的区别。
notifyDataSetChanged:粮仓中得粮食少了,或者多了,发送通知。
notifyDataSetInvalidated:粮仓变换了,比如原来从A仓取粮食,现在换成了B粮仓。
其次看一下,Java中对象和对象的引用。
java 中使用new 方法创建对象。同时把对象的地址赋值给一个变量。
大家需要明白的是,这个变量,并不是对象,而是存储对象地址的一个变量。这个有点绕。
还是用粮仓来比喻,new一个对象,就相当于创建了一个粮仓。而这个粮仓的地址就是你声明的对象变量。
Java中得对象可以说是没有生命周期这一说法的,因为他只用存在和销毁两种状态。也就是说,对象从创建后,直到被系统回收,是一直存在的。他不会随着你声明的变量销毁而销毁。
明白了以上两点,我们再分析一下,为什么Adapter中的两种方法为什么不起作用。
还是用粮仓来做比喻吧。
设有粮仓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。
其实一切的原因都是Java中对象和引用的理解。有时间再写例子吧
- 论Android Adapter notifyDataSetChanged 与notifyDataSetInvalidated无效原因
- 论Android Adapter notifyDataSetChanged与notifyDataSetInvalidated无效原因
- 论Android Adapter notifyDataSetChanged与notifyDataSetInvalidated无效原因
- 论Android Adapter notifyDataSetChanged与notifyDataSetInvalidated无效原因
- 论Android Adapter notifyDataSetChanged与notifyDataSetInvalidated无效原因
- Adapter中使用notifyDataSetChanged 与notifyDataSetInvalidated无效
- Android Adpater中的notifyDataSetChanged和notifyDataSetInvalidated 无效原因
- Android adapter.notifyDataSetChanged无效
- Android中adapter调用notifyDataSetChanged无效原因总结
- android adapter 调用notifyDataSetChanged 无效
- adapter 的notifyDataSetInvalidated和notifyDataSetChanged
- Android中Adapter的notifyDataSetInvalidated()和notifyDataSetChanged()的区别!
- Android中Adapter的notifyDataSetInvalidated()和notifyDataSetChanged()的区别!
- Android中Adapter的notifyDataSetInvalidated()和notifyDataSetChanged()的区别!
- Android中Adapter的notifyDataSetInvalidated()和notifyDataSetChanged()的区别
- Android中Adapter的notifyDataSetInvalidated()和notifyDataSetChanged()的区别!
- Android中Adapter的notifyDataSetInvalidated()和notifyDataSetChanged()的区别
- adapter调用notifyDataSetChanged 无效的原因
- JS垫脚石-DOM篇2
- Java多线程之并发安全经典案例-卖票
- hdu 1789 贪心
- 欢迎使用CSDN-markdown编辑器
- 网络通信框架Netty的TCP粘包/拆包解决方案
- 论Android Adapter notifyDataSetChanged与notifyDataSetInvalidated无效原因
- Android开发多线程时的注释事项
- 深度学习经验备忘录
- 一个签到函数
- iOS 应用文件夹地址获取
- CollapsingToolbarLayout用法详解(简洁易懂)
- Android 查看内存使用情况
- webrtc 源码分析
- 面试:实现AB两个数的值交换