当前位置: 移动技术网 > IT编程>移动开发>Android > Android 调用notifyDataSetChanged方法失败解决办法

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

环保错位,西游日记,遮天之皇极帝道

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方法失败的常见原因及解决办法的总结,如有疑问希望大家留言讨论,或者到本站社区讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网