关于notifyDataSetChanged不能动态刷新ListView的问题
2015-12-21 10:46
337 查看
也许很多的刚开始学习Android开发的朋友,在动态刷新ListView时,使用notifyDataSetChanged时并没有起到作用。我当时也被这个问题困扰好一段时间确实很痛苦。我当时想到了一个很蠢的做法就是重新设置adapter重新绑定数据源。很显然这样是非常不合理的。那么今天我们就使用适配器自带的notifyDataSetChanged这个API来完成ListView的更新。
使用ListView的数据源的原理如我们的数据源来自ArrayList。通常我们的做法是创建一个已经有我们想要提供ListView的数据ArrayList 如:
注意我们这里的list已经指向一个堆内存了,接着我们想要改变list中的数据,而这个时候,就需要注意了,如:我们在代码中有另外一个ArrayList叫做newlist.
这时候,newlist指向的是一个和list指向不同的堆内存,这个时候,我们直接用list = newlist来把newlist的数据交给list,在这里,实际上只是把list的指向改变了,让它也指向newlist指向的那个内存。那么这个时候我们再调用notifyDataSetChanged这个方法来通知listview更新数据就起不了任何作用了,原因很简单,就是list的指向已经改变,而调用notifyDataSetChanged会去检查原来list指向的数据是否变化,但是这时的list已经不是原来的list了,所以它无法判断,只能不作出响应了。那么,这个问题的解决方法是直接在原来的list上面更改数据,可以使用下面的代码来操作:
这样,list的指向就不会改变,它还是指向原来的那块内存,这样调用notifyDataSetChanged()就可以起作用了。通过这种方式我们的增删改都可以动态更新了。
结论:在这里的重点就是要注意在开始传给ListView的list指向不能被改变。需要从始至终指向同一个内存,这样调用notifyDataSetChanged后就能够检测到list的数据变化,从而触发ListView的重新绘制了。
使用ListView的数据源的原理如我们的数据源来自ArrayList。通常我们的做法是创建一个已经有我们想要提供ListView的数据ArrayList 如:
ArrayList<String> list=new ArrayList<String>; list.add(1)
注意我们这里的list已经指向一个堆内存了,接着我们想要改变list中的数据,而这个时候,就需要注意了,如:我们在代码中有另外一个ArrayList叫做newlist.
ArrayList<String> newList=new ArrayList<String>; newList.add(2);
这时候,newlist指向的是一个和list指向不同的堆内存,这个时候,我们直接用list = newlist来把newlist的数据交给list,在这里,实际上只是把list的指向改变了,让它也指向newlist指向的那个内存。那么这个时候我们再调用notifyDataSetChanged这个方法来通知listview更新数据就起不了任何作用了,原因很简单,就是list的指向已经改变,而调用notifyDataSetChanged会去检查原来list指向的数据是否变化,但是这时的list已经不是原来的list了,所以它无法判断,只能不作出响应了。那么,这个问题的解决方法是直接在原来的list上面更改数据,可以使用下面的代码来操作:
list.clear(); list.addAll(newList); adapter.notifyDataSetChanged();
这样,list的指向就不会改变,它还是指向原来的那块内存,这样调用notifyDataSetChanged()就可以起作用了。通过这种方式我们的增删改都可以动态更新了。
结论:在这里的重点就是要注意在开始传给ListView的list指向不能被改变。需要从始至终指向同一个内存,这样调用notifyDataSetChanged后就能够检测到list的数据变化,从而触发ListView的重新绘制了。
相关文章推荐
- hdu1025 Constructing Roads In JGShining's Kingdom (nlogn的LIS)
- nginx下载安装
- linux 各种发行版及包管理器的关系
- java.lang.Runtime类总结
- Android手机联系人快速索引(手机通讯录)
- java 格式化 例子
- spark on yarn图形化任务监控利器:History-server帮你理解spark的任务执行过程
- Linux心跳---HZ
- Java 多线程 并发编程
- 实例1:实现跟踪鼠标单击状态的图片按钮
- 读取大csv文件数据插入到MySql或者Oracle数据库通用处理
- mysql小问题
- linux监控命令
- XP登录密码和任务计划的处理
- 宜信旗下网络P2P平台宜人贷在美国纽交所上市
- ALM11客户端安装办法
- 表单只能输入特定数据类型(数字、字母等)
- 源码安装mysql
- myeclips 2015 激活
- VBox安装CtenOS6.5