最近发现使用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);
此时mAdapter保存了mList的引用
List<String> newList= new ArrayList<String>();
newList.add("http://fir.im/holdyou");
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);
mAdapter.notifyDataSetChanged();
public void setList(List<String> list) {
this.mList = list;
}
mAdapter.setList(mList);
mAdapter.notifyDataSetChanged();