Android ListView Adapter notifyDataSetChanged 刷新没有效果

时间:2021-07-08 19:36:05

1、唠叨 

最近发现使用ListView的时候,通过调用Adpater的notifyDataSetChanged方法不能刷新UI数据显示 
2、原因分析 
1).数据源没有更新,调用notifyDataSetChanged无效。 
2).数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效(一般主要是这种情况,使用了新创建的list对象(List<E> datalist=new ArrayList ),但是adapter中的是原始initlist对象)。 
3).数据源更新了,但是adpter没有收到消息通知,无法动态更新列表。 
3、解析

List<String> mList=new ArrayList<String>();
mList.add("http://fir.im/yzappsec");
CusAdapter mAdapter = new CusAdapter(this,mList);
listView.setAdapter(mAdater);
  • 1
  • 2
  • 3
  • 4
Android ListView Adapter notifyDataSetChanged 刷新没有效果

此时mAdapter保存了mList的引用

//模拟一个新数据
List<String> newList= new ArrayList<String>();
newList.add("http://fir.im/holdyou");
//赋值给mList
mList = newList;
//此时调用,发现没有效果
mAdapter.notifyDataSetChanged();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

当newList赋值给mList的时候 mList指向了一个新的List,但是notifyDataSetChanged方法调用的时候,mAdapter却更新的是保存的引用,因此原引用根本没发生变化,不会更新UI显示。

4、代码展示几种解决办法

//方法一
mList.add("http://fir.im/holdyou");
List<String> newList = new ArrayList<String>();
for (String temp : mList) {
newList.add(temp);
}
mList.clear();
mList.addAll(newList);
//此时mList中就是2条数据
mAdapter.notifyDataSetChanged();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
//方法二
//通过向自定义的Adapte中增加更新数据的方法
public void setList(List<String> list) {
this.mList = list;
}
//在使用的时候调用
mAdapter.setList(mList);
mAdapter.notifyDataSetChanged();