[项目总结]论Android Adapter notifyDataSetChanged与notifyDataSetInvalidated无效原因

最近在开发中遇到一个问题,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无效原因,布布扣,bubuko.com

[项目总结]论Android Adapter
notifyDataSetChanged与notifyDataSetInvalidated无效原因

时间: 2024-12-25 05:39:19

[项目总结]论Android Adapter notifyDataSetChanged与notifyDataSetInvalidated无效原因的相关文章

Android adapter适配器的使用

ListView之SimpleAdapter SimpleAdapter的构造函数是: public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) 参数context:上下文,比如this.关联SimpleAdapter运行的视图上下文 参数data:Map列表,列表要显示的数据,这部分需要自己实现,如例子中的ge

android adapter报错The content of the adapter has changed but ListView did not receive a notification.

在Android编程中使用Adapter时,偶尔会出现如下错误: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. DDMS中的log也无法定位到准确的出错位置.检

android使用notifyDataSetChanged()方法,listview数据没有更新

android使用notifyDataSetChanged()方法,发现adapter的数据更新了,但是ListView的内容没有更新? 查阅如下网站解决方案都没有解决: http://blog.csdn.net/williamz1980/article/details/5837998 http://15975604853.blog.163.com/blog/static/1182880352012710113831147/ 后来冷静一想,我遇到这个问题的情景跟他们的有所区别: 我的问题是从另个

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

Android Adapter基本理解: 我的理解是: 1.一个有许多getter的类(就是getView(),getCount()....这些方法) 2.有多少个get方法?都是什么? 这些getter是特定的,你可以复写他们,全部的方法如下 其中一般我们只用复写getCount(),getView(),getItemId(),getItem()这四个方法 3.这些被谁调用? 这些getter是被android系统自行调用的(具体如何调用,作为像我这样的新手做稍微了解就好) 4.为什么要复写这

Ecplise项目转移到Android Studio,以及Genymotion模拟器介绍

一.移植android项目 今天简单分享一个从ecplise开发项目转移到Android Studio的方法,之前一直在ecplise上开发android项目,但是因为google现在主打Android Studio,所以我也只好跟随潮流啦.所以转移项目资源还是必须的. 1.首先还是得有android Studio,这个在我之前的博客里面就有,这里就不复述了. 2.在eclipse项目中导出gradle项目. (1)具体路径在File->Export->Generate Gradle buil

怎么将Eclipse 项目切换到Android Studio

怎么将Eclipse 项目切换到Android Studio? Google 官方已经给出了两种解决方式解决方案. 第一种 直接选择目录,next 一直到最后,我们的Eclipse 的项目就到了Android Studio 上了,需要注意的是,这样导入的项目还是会保留Eclipse 的构建方式,比如我们在Eclipse 上使用Ant 构建,迁移后还是会是会用Ant 构建. 导入Eclipse ADT 第二种 首先,我们在Eclipse 将项目导出为Gradle 项目. 选择导出 导出Gradle

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

如果你之前有用Eclipse做过安卓开发,现在想要把Eclipse中的项目导入到Android Studio的环境中,那么首先要做的是生成Build Gradle的文件.因为Android Studio 是用Gradle来管理项目的,具体操作步骤如下: 从Eclipse中导出        1.将你的ADT插件版本升级到22.0以上.        2.在Eclipse中,选择File-->Export.        3.在弹出的导出窗口中,打开Android的文件夹,选择“Generate

adapter.notifyDataSetChanged执行的时候没有执行getview,adapter内容改变了

============问题描述============ 发现了一个奇怪的问题,adapter我改变了里面的内容,但是adapter.notifyDataSetChanged的时候却没有执行getview,不知道是我哪里写错了,求问 ============解决方案1============ 你的adapter 跟listView 绑定了吗? 或者绑定被错误置换了? getView 是由 listView 调用的. ============解决方案2============ 缓存!!!!!!!!

Android Adapter详解

Android Adapter Adapter是用来帮助填充数据的中间桥梁,比如通过它将数据填充到ListView, GridView, Gallery.而android 提供了几种Adapter:ArrayAdapter, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter