当前位置:首页 > Android

论Android Adapter notifyDataSetChanged与notifyDataSetInvalidated无效原因

canca12年前 (2013-10-31)Android617

最近在开发中遇到一个问题,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中对象和引用的理解。有时间再写例子吧。

扫描二维码推送至手机访问。

版权声明:本文由Ant.Master's Blog发布,如需转载请注明出处。

本文链接:https://iant.work/post/129.html

标签: Android
分享给朋友:

“论Android Adapter notifyDataSetChanged与notifyDataSetInvalidated无效原因” 的相关文章

android上的i-jetty (2)用Servlet显示Android设备的app列表

android上的i-jetty (2)用Servlet显示Android设备的app列表

环境 : android + i-jetty + servletMyServlet.java package com.synnex.servlet; import java.io.ByteArrayOutputStream; import java.io.IOException; import j…

Android Composite ADB Interface驱动在XP下无法安装解决办法

Xp方法如下: 1、删除 C:\WINDOWS\system32\drivers 下 wdf01000.sys 、wdfldr.sys 我的电脑右键——管理——设备管理器内找到黄色叹号(前提要插上小米)卸载 Android Composite ADB Interface后,扫描硬件改动,重新安装驱动…

onActivityResult传值的使用

onActivityResult传值的使用

有时候在群里加入的新人总会喜欢问一些过去的问题  有时候不想回答 是因为回答的次数多了不回答又打击人的积极性  谁让自己接触的早呢  为了省劲还是把简单的东西作为指导篇吧 多个activity之间的传值 其实就...…

android.os.NetworkOnMainThreadException

android.os.NetworkOnMainThreadException

    在android 2.3上设计的下载程序,在android 4.0上运行时报android.os.NetworkOnMainThreadException异常,原来在4.0中,访问网络不能在主程序中进行,有两个方法可以解决,一个是在主程序中增加: Java代码&…

Android 使用 adb命令 远程安装apk

./adb devices 列出所有设备…

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。