当前位置: 首页 > news >正文

安卓中对notifyDataSetChanged()和notifyDataSetInvalidated的源码解析

学习它的用处:

一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力。当对象们连接在一起时,它们就可以相互提供服务和信息。

通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信。但是出于各种原因,你也许并不愿意因为代码环境的改变而对代码做大的修改。也许,你只想根据你的具体应用环境而改进通信代码。或者,你只想简单的重新构造通信代码来避免类和类之间的相互依赖与相互从属。


直接开看源码:首先第一步看baseadapter源码:这里主要实现了一个观察者,DataSetObservable可以接受各种DataSetObserver下面讲解DataSetObserver。

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
    private final DataSetObservable mDataSetObservable = new DataSetObservable();


    public boolean hasStableIds() {
        return false;
    }
    
    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }


    public void unregisterDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.unregisterObserver(observer);
    }
    
    /**
     * Notifies the attached observers that the underlying data has been changed
     * and any View reflecting the data set should refresh itself.
     */
    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }


    /**
     * Notifies the attached observers that the underlying data is no longer valid
     * or available. Once invoked this adapter is no longer valid and should
     * not report further data set changes.
     */
    public void notifyDataSetInvalidated() {
        mDataSetObservable.notifyInvalidated();
    }

进入DataSetObservable看它是干什么的:notifyChanged同步调用mObserver的onChanged notifyInvalidated调用mObserver的onInvalidated。

public class DataSetObservable extends Observable<DataSetObserver> {
    /**
     * Invokes {@link DataSetObserver#onChanged} on each observer.
     * Called when the contents of the data set have changed.  The recipient
     * will obtain the new contents the next time it queries the data set.
     */
    public void notifyChanged() {
        synchronized(mObservers) {
            // since onChanged() is implemented by the app, it could do anything, including
            // removing itself from {@link mObservers} - and that could cause problems if
            // an iterator is used on the ArrayList {@link mObservers}.
            // to avoid such problems, just march thru the list in the reverse order.
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onChanged();
            }
        }
    }


    /**
     * Invokes {@link DataSetObserver#onInvalidated} on each observer.
     * Called when the data set is no longer valid and cannot be queried again,
     * such as when the data set has been closed.
     */
    public void notifyInvalidated() {
        synchronized (mObservers) {
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onInvalidated();
            }
        }
    }
}


而现在onChanged 和onInvalidated的具体实现在哪里? 现在打开abslistview 查询这句话  mDataSetObserver = new AdapterDataSetObserver();
            mAdapter.registerDataSetObserver(mDataSetObserver);

意思也就是实现函数具体在mDataSetObserver里面,然后接下来看什么是mDataSetObserver:


 class AdapterDataSetObserver extends AdapterView<ListAdapter>.AdapterDataSetObserver {
        @Override
        public void onChanged() {
            super.onChanged();
            if (mFastScroll != null) {
                mFastScroll.onSectionsChanged();
            }
        }


        @Override
        public void onInvalidated() {
            super.onInvalidated();
            if (mFastScroll != null) {
                mFastScroll.onSectionsChanged();
            }
        }
    }






http://www.xdnf.cn/news/799741.html

相关文章:

  • 七夕情人节表白网页代码大全(浪漫的html表白源代码)
  • 如何用会声会影制作简约的倒计时片头
  • 百度云干货资源
  • CSDN企业账户用户手册操作文档
  • java中的递归函数调用函数_java 递归函数
  • VS2008 ACtivex 制作CAB带 Vcredist_x86.exe 方案
  • 常见无法登陆MSN原因
  • 关于优质博客聚合的一点思考
  • 公交车查询系统软件测试,公交APP评测:谁是最好用的公交线路查询软件?
  • 郭涛 黄渤 田原09贺岁大片《高兴》DVD修正版
  • Lesson40 FIFO的配置与使用
  • 从Win32程序中的主函数中获取命令行参数 _twinmain
  • InputFormatOutputFormat
  • [正则表达式]文本框输入内容控制=限制仅仅只给输入数字;中文;英文;符号。
  • android一些细节问题
  • Windows XP任务计划不能执行的解决的方法
  • BigWorld
  • DOTA系列 食尸鬼(小狗)攻略
  • 一份较详细的MS服务
  • CheckBox复选框
  • 关于自己项目(听书系统)的简介
  • Windows Media Player 播放.WMV文件破解许可证
  • SID310S/D/Q-10MHz, 低噪声, 轨至轨, CMOS 运算放大器替代SGM722
  • Windows新版算号器技术原理
  • 柏睿网络-建设机房的必要性
  • 什么是Google PR值? 如何提高PR值
  • Bitmap recycle()
  • Linux操作系统各版本ISO镜像下载(包括oracle linux\redhat\centos\ubuntu\debian等)
  • 智能影视站系统 光线 CMS1.5 正式版
  • ArrayList的遍历方式