最近在开发中遇到一个问题,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无效原因的更多相关文章

  1. android listview用adapter.notifyDataSetChanged()无法刷新每项的图标

    http://blog.csdn.net/caizhegnhao/article/details/41318575 今天在开发中遇到一个很奇怪的listview的问题. 这个问题情景是我的应用需要做一 ...

  2. ListView动态刷新adapter.notifyDataSetChanged()无反应

    前段时间在做一个动态刷新ListView(模拟聊天),遇到一个问题,调用notifyDataSetChanged()方法,数据源已经存在但是并没有动态刷新! 首先我们需要了解notifyDataSet ...

  3. adapter.notifydatasetchanged()没有效果

    项目中有个列表的处理,通过一个参数判断是下拉刷新数据还是加载更多数据,结果下拉刷新就是显示不出来界面,数据是有,就开始searching~,搜出很多相关问题,大意如下: 1 当数据源发生变化的时候,我 ...

  4. [转]Android Adapter以及getView()方法的理解

    Android Adapter基本理解: 我的理解是: 1.一个有许多getter的类(就是getView(),getCount()....这些方法) 2.有多少个get方法?都是什么? 这些gett ...

  5. Android Adapter基本理解

    感谢大佬:https://blog.csdn.net/l799069596/article/details/47301711 Android Adapter基本理解: 我的理解是: 1.一个有许多ge ...

  6. 如何将Eclipse中的项目迁移到Android Studio 中

    如何将Eclipse中的项目迁移到Android Studio 中 如果你之前有用Eclipse做过安卓开发,现在想要把Eclipse中的项目导入到Android Studio的环境中,那么首先要做的 ...

  7. [转]-如何将Eclipse中的项目迁移到Android Studio 中

    英文地址:http://developer.android.com/sdk/installing/migrate.html 翻译:Android Studio 中文组(大锤译) 如果你之前有用Ecli ...

  8. studio--如何将Eclipse中的项目迁移到Android Studio 中

    如果你之前有用Eclipse做过安卓开发,现在想要把Eclipse中的项目导入到Android Studio的环境中,那么首先要做的是生成Build Gradle的文件.因为Android Studi ...

  9. Android 开源项目 eoe 社区 Android 客户端(转)

    本文内容 环境 开源项目 eoe 社区 Android 客户端 本文介绍 eoe 社区 Android 客户端.它是一个开源项目,功能相对简单,采用侧边菜单栏.可以学习一下.点击此处查看 GitHub ...

随机推荐

  1. 【Go语言学习笔记】函数做参数和闭包

    函数做参数 在Go语言中,函数也是一种数据类型,我们可以通过type来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型.类似于重写(同名覆盖). 回调函数:函数有一个参数是函数类型,这个 ...

  2. Java不同时区(timezone)之间时间转换

    最近出现一个问题是这样的:我们的系统在国外打印的日志时间由于时差关系和国内不一致,看起来不方便,希望国外的日志和国内保持一致,即:需要对不同时区的时间做转换调整,统一为国内时间. 一.关于时区的一些概 ...

  3. Solon 1.5.67 发布,增加 GraalVm Native 支持

    Solon 已有120个生态扩展插件,此次更新主要为细节打磨: 添加 solon.extend.graalvm 插件,用于适配 graalvm native image 模式 从此,solon 进入 ...

  4. Type mismatch:

    Type mismatch: cannot convert from java.sql.PreparedStatement to com.mysql.jdbc.PreparedStatement im ...

  5. [Comet1173]最简单的题

    称区间$[l,r]$的"信息"为其的答案和第一个.最后一个大于$x$的位置,显然通过$[l,mid]$和$[mid+1,r]$的信息可以$o(1)$合并得到$[l,r]$的信息 考 ...

  6. [ARC117D]Miracle Tree

    将$E_{i}$从小到大排序(显然不会相同),假设$E_{p_{i}}$为从小到大第$i$小 此时,必然有$E_{p_{1}}=1$,否则可以将$E_{p_{i}}$都减去$E_{p_{1}}-1$, ...

  7. HDC技术分论坛:HarmonyOS新一代UI框架的全面解读

    作者:yuzhiqiang,UI编程框架首席技术专家 在Harmony 3.0.0开发者预览版中,包含了新一代的声明式UI框架ArkUI 3.0.多语言跨平台编译器ArkCompiler 3.0.跨端 ...

  8. .NET E F(Entity Framework)框架 DataBase First 和 Code First 简单用法。

    EF是微软.NET平台官方的ORM(objet-relation mapping),就是一种对象-关系 映射,是将关系数据库种的业务数据用对象的形式表现出来,并通过面向对象的方式讲这些对象组织起来,实 ...

  9. CF1477A Nezzar and Board

    考虑 \(2x - y\) 我们改为 \(x + (x - y)\) 是一个更好的形式. 我们可以表示一个数为\(x_i + \sum_{j,k}(x_j - x_k) = K\) 我们考虑移到 \( ...

  10. Pollard-Rho 算法

    Pollard-Rho 一种复杂度大概在 $ O(n^{\frac 1 4} \log n) $ 的分解质因数方法. Miller-Rabin 给定一个 $ 10^{18} $ 范围的数,判断质数 由 ...