1、唠叨
最近发现使用ListView的时候,通过调用Adpater的notifyDataSetChanged方法不能刷新UI数据显示
2、原因分析
1).数据源没有更新,调用notifyDataSetChanged无效。
2).数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效。
3).数据源更新了,但是adpter没有收到消息通知,无法动态更新列表。
3、解析
List<String> mList=new ArrayList<String>();
mList.add("http://fir.im/yzappsec");
CusAdapter mAdapter = new CusAdapter(this,mList);
listView.setAdapter(mAdater);
此时mAdapter保存了mList的引用
//模拟一个新数据
List<String> newList= new ArrayList<String>();
newList.add("http://fir.im/holdyou");
//赋值给mList
mList = newList;
//此时调用,发现没有效果
mAdapter.notifyDataSetChanged();
当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();
//方法二
//通过向自定义的Adapte中增加更新数据的方法
public void setList(List<String> list) {
this.mList = list;
}
//在使用的时候调用
mAdapter.setList(mList);
mAdapter.notifyDataSetChanged();