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

Android 调用notifyDataSetChanged方法失败解决办法,第1张

概述Android调用notifyDataSetChanged方法失败解决办法如果使用ListView、GridView等进行数据展示,当绑定的数据有了更新的时候,需要实时刷新ListView,即调用Adapter的notifyDataSetChanged方法,但是很多人在调用之后

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,Arrays.asList(objects));}Arrays:public static <T> List<T> asList(T... array) {  return new ArrayList<T>(array);//注意这里的ArrayList不是常见的那个ArrayList,而是Arrays的一个内部类。。}

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

总结

以上是内存溢出为你收集整理的Android 调用notifyDataSetChanged方法失败解决办法全部内容,希望文章能够帮你解决Android 调用notifyDataSetChanged方法失败解决办法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1145656.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存