本文主要介绍Android调用notifyDataSetChanged方法失败的解决方案的相关信息。有需要的朋友可以参考一下。
Android 调用notifyDataSetChanged方法失败解决办法
如ListView、GridView等。都是用于数据显示的,当绑定数据更新时,ListView需要实时刷新,也就是调用适配器的notifyDataSetChanged方法,但是很多人会发现ListView就是调用后没有刷新的数据。原因是什么?下面会详细解释。
1.数据源尚未更新,调用notifyDataSetChanged无效。
2.数据源被更新,但它指向一个新的引用。调用notifyDataSetChanged无效。
3.数据源已经更新,但是adpter没有收到消息通知,所以无法动态更新列表。
一个典型的错误是:
list=new String[]{ ' listView item ' };
adapter=new ArrayAdapterString(这个,android。R.layout.simple_list_item_1,list);
listView.setAdapter(适配器);
list=new String[]{ ' new listView item ' };
adapter . notifydatasetchanged();
我一直以为适配器会监控列表的变化。当列表被重新初始化时,ListView将自动刷新数据。实际上,适配器监视新字符串[]{'listView item'}的变化。适配器本身保存对原始数据源的内部引用inner_list(新字符串[]{'listView item'})。
当执行list=new string[]{ ' new listview 1 item ' }时;语句后,列表被重新初始化,相当于切断了列表与原数据源的关系(new String[]{'listView item'})。因此,稍后调用notifyDataSetChanged将不起作用,因为list和inner_list已经是堆上存在的完全不同的对象。
错误回顾:
前段时间以Arrayist等为原始数据源,一般进行add等操作。因此,list和inner_list始终保持对同一个变量的引用,没有问题。当然,换成直接分配,调用无效。因此,需要对原始数据对象进行操作,而不是重新赋值。
看看Arrayadapter的源代码:
ArrayAdapter:
public array adapter(Context Context,int textViewResourceId,T[] objects) {
init(context,textViewResourceId,0,arrays . aslist(objects));
}
数组:
公共静态测试列表asList(T.数组){
返回新的ArrayList t(array);//注意这里的ArrayList不是常见的ArrayList,而是数组的内部类。
}
以上是Android调用notifyDataSetChanged方法常见原因及解决方法的总结。如有疑问,欢迎留言讨论,或前往本站社区讨论。感谢您的阅读,希望对您有所帮助,也感谢您对本站的支持!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。