或许非常多开发的朋友。尤其是Android刚開始学习的人,在动态刷新ListView时。使用notifyDataSetChanged并没有起到作用。
有时会被困扰得非常痛苦。
事实上,在使用notifyDataSetChanged过程中,还是有细节须要注意的。举个样例:
我的ListView使用的数据源是来自ArrayList。
通常我们的做法是创建一个已经有我们想要提供给ListView的数据的ArrayList,比如:
ArrayList<Integer> list = new ArrayList<Interger>;
list.add(1);
这里我们的list已经是指向了一个堆内存上了。
接着我们想要改变list中的数据,而这个时候。就须要注意了,举个样例:我们在代码中有另外一个ArrayList叫做newlist,它是使用以下代码创建出来的:
ArrayList<Integer> newlist = new ArrayList<Interger>;
list.add(2);
这个时候,newlist指向的是一个和list指向不同的堆内存,这个时候。我们直接用list = newlist来把newlist的数据交给list,在这里,实际上仅仅是把list的指向改变了。让它也指向newlist指向的那个内存。
那么这个时候我们再调用notifyDataSetChanged这种方法来通知listview更新数据就起不了不论什么作用了。原因非常easy,就是list的指向已经改变。而调用notifyDataSetChanged会去检查原来list指向的数据是否变化。可是这时的list已经不是原来的list了。所以它无法推断。仅仅能不作出响应了。那么。这个问题的解决方法是直接在原来的list上面更改数据,能够使用以下的代码来操作:
list.clear();
list.addAll(newlist);
adapter.notifyDataSetChanged();
这样。list的指向就不会改变,它还是指向原来那块内存。这样调用notifyDataSetChanged()就能够起作用了。
总结:在这里的重点就是要注意在開始时传给ListView的list指向不能被改变。须要从始至终指向同一个内存。这样调用notifyDataSetChanged后就行检測到list的数据变化,从而触发ListView的又一次绘制了!