Android ListView Adapter notifyDataSetChanged 刷新没有效果

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");
//赋值给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();

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android 开发中,ListView 是一个常用的控件,用于展示列表数据。当数据源发生改变时,我们可以通过调用 adapternotifyDataSetChanged 方法来通知 ListView 刷新数据。不过有时候,调用该方法后 ListView没有刷新成功,这是为什么呢? 通常情况下,adapter 调用 notifyDataSetChanged 方法后 ListView 会自动刷新,但有一些情况下会出现刷新失败的情况,主要原因如下: 1. 数据源未更新 notifyDataSetChanged 方法只能刷新 adapter 中的数据源,如果数据源没有更新,那么 ListView 就无法刷新。因此,在调用该方法之前,必须要确保 adapter 中的数据源已经更新。 2. ListView 高度计算错误 当 ListView 的高度计算错误时,可能会导致刷新失败。当 ListView 的高度设置为 wrap_content 时,它的高度会根据内容自适应,这时如果数据源发生变化,ListView 的高度也会发生变化,但是 ListView 并不会自动刷新,需要手动调用 requestLayout 方法来重新计算布局。 3. ListView 处于滚动状态 当 ListView 处于滚动状态时,调用 notifyDataSetChanged 方法可能会失效。因为在滚动过程中,ListView 的布局已经被固定,此时调用 notifyDataSetChanged 方法并不会改变布局,只有当滚动停止后才会刷新数据。如果需要在滚动状态下刷新数据,可以尝试使用 notifyDataSetInvalidated 方法。 综上所述,ListView adapter 调用 notifyDataSetChanged 方法无效的原因可能是数据源未更新、ListView 高度计算错误或者 ListView 处于滚动状态。需要根据具体情况进行分析和解决。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值