现在的位置: 首页 > 综合 > 正文

ListView 改变数据源后 notifyDateSetChanged不起作用

2018年01月11日 ⁄ 综合 ⁄ 共 811字 ⁄ 字号 评论关闭

使用notifyDataSetChanged更新ListView的数据源时,要注意:

ListView使用的数据源是来自ArrayList。通常我们的做法是创建一个已经有我们想要提供给ListView的数据的ArrayList,例如:

[java] view
plain
copy在CODE上查看代码片派生到我的代码片

  1. ArrayList<Integer> list  = new ArrayList<Interger>;  
  2. list.add(1);  

这时list已经是指向了一个堆内存上了。此时,如果我们想要改变ListView的数据源为另外一个ArrayList叫做newlist,它是使用下面代码创建出来的:

[java] view
plain
copy在CODE上查看代码片派生到我的代码片

  1. ArrayList<Integer> newlist  = new ArrayList<Interger>;  
  2. list.add(2);  

这个时候,newlist和list指向不同的堆内存,如果我们直接用list = newlist来把newlist的数据交给list,实际上仅仅把list的指向改变了。

此时,我们再调用notifyDataSetChanged这个方法来通知listview更新数据就起不了任何作用了,原因很简单,就是list的指向已经改变,而调用notifyDataSetChanged会去检查原来list指向的数据是否变化,但是这时的list已经不是原来的list了,所以它无法判断,只能不作出响应了。那么,这个问题的解决方法是直接在原来的list上面更改数据,可以使用下面的代码来操作:

[java] view
plain
copy在CODE上查看代码片派生到我的代码片

  1. list.clear();  
  2. list.addAll(newlist);  
  3. adapter.notifyDataSetChanged();  

这样,list的指向就不会改变,它还是指向原来那块内存,这样调用notifyDataSetChanged()就可以起作用了。

抱歉!评论已关闭.