关于Adapter的notifyDataSetChanged是否生效
2016-04-10 16:45
357 查看
最近在开发android一个项目的时候,发现有时候notifyDataSetChanged不起作用。后来发现是我理解错了。
一个典型的错误是:
list1 = new String[]{“listView1 item”};
ap1 = new ArrayAdapter(this,android.R.layout.simple_list_item_1,list1);
listView1.setAdapter(ap1);
list1 = new String[]{“new listView1 item”};
ap1.notifyDataSetChanged();
我一直以为ap1会监听list1的变化,重新初始化list1,然后执行相应的更新,现在才知道不对,ap1监听的是new String[]{“listView1 item”}的变化。
换种说法就是ap1本身会保存一个对原始数据源(new String[]{“listView1 item”})的内部引用inner_list1。
list1 = new String[]{“new listView1 item”};相当与切断了list1与原始数据源(new String[]{“listView1 item”})的关系,因此之后调用notifyDataSetChanged并不会起作用,因为list1 和inner_list1已经是存在于堆上的完全不同的两个对象了,自然而然,notifyDataSetChanged是不会生效的了,仅此牢记!
一个典型的错误是:
list1 = new String[]{“listView1 item”};
ap1 = new ArrayAdapter(this,android.R.layout.simple_list_item_1,list1);
listView1.setAdapter(ap1);
list1 = new String[]{“new listView1 item”};
ap1.notifyDataSetChanged();
我一直以为ap1会监听list1的变化,重新初始化list1,然后执行相应的更新,现在才知道不对,ap1监听的是new String[]{“listView1 item”}的变化。
换种说法就是ap1本身会保存一个对原始数据源(new String[]{“listView1 item”})的内部引用inner_list1。
list1 = new String[]{“new listView1 item”};相当与切断了list1与原始数据源(new String[]{“listView1 item”})的关系,因此之后调用notifyDataSetChanged并不会起作用,因为list1 和inner_list1已经是存在于堆上的完全不同的两个对象了,自然而然,notifyDataSetChanged是不会生效的了,仅此牢记!
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories