Android中Adapter的notifyDataSetInvalidated()和notifyDataSetChanged()的区别

notifyDataSetChanged方法通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容。

public void notifyDataSetChanged ()

该方法内部实现了在每个观察者上面调用onChanged事件。每当发现数据集有改变的情况,或者读取到数据的新状态时,就会调用此方法。

public void notifyDataSetInvalidated ()

该方法内部实现了在每个观察者上面调用onInvalidated事件。每当发现数据集监控有改变的情况,比如该数据集不再有效,就会调用此方法。

今天用到Listview刷新功能,之前解决都是给Listview重新负上adapter这样listview就滚动到第一条了,但是这样会有些耗内存,程序写法也不美观。理论上是这样的,需要实验一下,重要的是一下两句话!
notifyDataSetInvalidated(),会重绘控件(还原到初始状态)选项会跳转到第一项
notifyDataSetChanged(),重绘当前可见区域,停留在当前选项

项目中不需要每次都刷新,所以采用notifyDataSetChanged()

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id){
        systemSettingListView.setSelection(position);
        Fragment fragment = null; 
        if (position == NET_SEETING) { 
            fragment = new SystemSettingNetContentFragment();;
        } else if (position == ACCOUNT_SETTING) { 
            fragment = new SystemSettingAccountContentFragment();
        } else if (position == AUDIO_SETTING) { 
            fragment = new SystemSettingAudioContentFragment();
        } else if (position == VIDEO_SETTING) { 
            fragment = new SystemSettingVideoContentFragment();
        } else if (position == NET_UPDATE) { 
            fragment = new SystemSettingUpdateContentFragment();
        } else if (position == STATUS_FIND) { 
            fragment = new SystemSettingStatusContentFragment();

        } 
        adapter.setSelectItem(position);
        adapter.notifyDataSetChanged();
        getFragmentManager().beginTransaction()
        .replace(R.id.system_setting_right_fragment, fragment).commit(); 

    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android 开发,ListView 是常用的列表控件,而 Adapter 则是 ListView 显示列表数据的适配器。当数据源改变时,我们需要调用 AdapternotifyDataSetChanged() 方法来通知 ListView 更新数据。不过有时候,我们会发现调用 notifyDataSetChanged() 方法后,ListView 并没有更新数据,这通常是由以下几个原因造成的: 1. 数据源没有更新 在调用 notifyDataSetChanged() 方法之前,需要先确保数据源已经更新了。如果数据源没有更新,调用 notifyDataSetChanged() 方法也不会更新 ListView 显示的数据。 2. Adapter 对象没有重新设置 如果使用的是同一个 Adapter 对象,那么需要重新设置 Adapter 对象才能更新 ListView 显示的数据。可以通过 setAdapter() 方法重新设置 Adapter 对象。 3. ListView 没有重新绘制 当调用 notifyDataSetChanged() 方法后,ListView 并不会立即重新绘制,而是等到系统认为需要重新绘制时才会更新。可以通过调用 invalidate() 方法让 ListView 立即重新绘制。 4. 数据源和 Adapter 对象不匹配 如果数据源和 Adapter 对象不匹配,即数据源的数据类型和 Adapter 的数据类型不一致,调用 notifyDataSetChanged() 方法也无法更新 ListView 显示的数据。 综上所述,如果在 ListView 调用 notifyDataSetChanged() 方法无效,可以先检查数据源是否更新,是否重新设置 Adapter 对象,是否调用了 invalidate() 方法以及数据源和 Adapter 对象是否匹配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值