关于ListView中adapter调用notifyDataSetChanged无效的原因

notifyDataSetChanged无效一般有以下几个原因:

1、数据源没有更新,调用notifyDataSetChanged无效。

2、数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效。

3、数据源更新了,但是adpter没有收到消息通知,无法动态更新列表。

对于问题2,假如数据源是 List<UserInfo> infos = new ArrayList<UserInfo>();  那在引用的时候不能重新

infos = new ArrayList<UserInfo>();  来给infos重新添加数据,因为这样的话就指向新的引用了,可以先infos.clean();

infos.addall();

然后再通知adapter.notifyDataSetChanged();或者

List<UserInfo> infosinfos2  = new ArrayList<UserInfo>();

infos  = infos2 ;进行赋值,总而言之adapter观察者监听的是数据源的数据变化,数据源更新,adapter才调用getview方法刷新UI;


在此附上notifyDataSetInvalidated()和notifyDataSetChanged()的区别 

notifyDataSetChanged方法通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容。
public void notifyDataSetChanged ()
该方法内部实现了在每个观察者上面调用onChanged事件。每当发现数据集有改变的情况,或者读取到数据的新状态时,就会调用此方法。
public void notifyDataSetInvalidated ()
该方法内部实现了在每个观察者上面调用onInvalidated事件。每当发现数据集监控有改变的情况,比如该数据集不再有效,就会调用此方法。

notifyDataSetInvalidated(),会重绘控件(还原到初始状态)
notifyDataSetChanged(),重绘当前可见区域


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值