Android 调用notifyDataSetChanged方法失败解决办法

所属分类: 软件编程 / Android 阅读数: 34
收藏 0 赞 0 分享

Android 调用notifyDataSetChanged方法失败解决办法

如果使用ListView、GridView等进行数据展示,当绑定的数据有了更新的时候,需要实时刷新ListView,即调用Adapter的notifyDataSetChanged方法,但是很多人在调用之后会发现ListView是数据并没有刷新,这是什么原因呢?下面将对其进行详细解释。

1、数据源没有更新,调用notifyDataSetChanged无效。
2、数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效。
3、数据源更新了,但是adpter没有收到消息通知,无法动态更新列表。

一个典型的错误是:

list = new String[]{"listView item"};
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
listView.setAdapter(adapter);
list = new String[]{"new listView item"};
adapter.notifyDataSetChanged();

原先一直以为adapter会监听list的变化,当重新初始化list之后,ListView会自动进行数据的刷新,其实不然,adapter监听的是new String[]{"listView item"}的变化。adapter本身会保存一个对原始数据源(new String[]{"listView item"})的内部引用inner_list。

当执行了list = new String[]{"new listView1 item"};语句之后,重新初始化了list,也就是相当与切断了list与原始数据源(new String[]{"listView item"})的关系,因此之后调用notifyDataSetChanged并不会起作用,因为list 和inner_list已经是存在于堆上的完全不同的两个对象了。

错误回顾:

前段时间都是使用的Arrayist等等作为原始数据源,一般都是进行add之类的操作,所以list和inner_list和一直都是保持对同一个变量的引用,并没有出什么问题,当然,改为直接赋值就会出现调用无效的问题。所以要针对原始数据对象进行操作,而不是重新赋值。

看了一下Arrayadapter的源码:

ArrayAdapter:
public ArrayAdapter(Context context, int textViewResourceId, T[] objects) {
  init(context, textViewResourceId, 0, Arrays.asList(objects));
}
Arrays:
public static <T> List<T> asList(T... array) {
  return new ArrayList<T>(array);//注意这里的ArrayList不是常见的那个ArrayList,而是Arrays的一个内部类。。
}


以上就是Android 调用notifyDataSetChanged方法失败的常见原因及解决办法的总结,如有疑问希望大家留言讨论,或者到本站社区讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多精彩内容其他人还在看

android开发之Json文件的读写的示例代码

这篇文章主要介绍了android开发之Json文件的读写的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android7.0指纹服务FingerprintService实例介绍

这篇文章主要介绍了Android7.0指纹服务FingerprintService介绍,需要的朋友可以参考下
收藏 0 赞 0 分享

Android JNI处理图片实现黑白滤镜的方法

这篇文章主要介绍了Android JNI处理图片实现黑白滤镜的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android引入OpenCV的示例

本篇文章主要介绍了Android引入OpenCV的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android Zip解压缩工具类分享

这篇文章主要为大家详细介绍了Android Zip解压缩工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android RxJava创建操作符Interval

这篇文章主要为大家详细介绍了Android RxJava创建操作符Interval的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

5分钟快速实现Android爆炸破碎酷炫动画特效的示例

本篇文章主要介绍了5分钟快速实现Android爆炸破碎酷炫动效的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android 指纹功能实例代码

本文通过一个demo给大家介绍了android指纹功能,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友参考下吧
收藏 0 赞 0 分享

Android实现倒计时CountDownTimer使用详解

这篇文章主要为大家详细介绍了Android实现倒计时CountDownTimer的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android RxJava创建操作符Timer的方法

这篇文章主要为大家详细介绍了Android RxJava创建操作符Timer的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多