Android ListView Adapter notifyDataSetChanged 刷新没有效果

来源:互联网 发布:c 语言编程软件 编辑:程序博客网 时间:2024/06/07 19:13

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

此时mAdapter保存了mList的引用

//模拟一个新数据List<String> newList= new ArrayList<String>();newList.add("http://fir.im/holdyou");//赋值给mListmList = 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();

阅读全文
0 0
原创粉丝点击