ListView与Adapter之间的观察者模式

ListView与Adapter之间的观察者模式

本文用文字叙述不太好描述,主要通过下面这张图来表示:
这张图体现出了主要的关系

这里写图片描述

- 首先创建一个MyAdapter继承BaseAdapter

public class MyAdapter extends BaseAdapter {
    private List<String> list;
    public MyAdapter(List<String> list) {
        this.list = list;
    }
    @Override
    public int getCount() {
        return list.size();
    }
    @Override
    public Object getItem(int position) {
        return null;
    }
    @Override
    public long getItemId(int position) {
        return 0;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return null;
    }
}

- 给ListView设置适配器

    MyAdapter adapter =  new MyAdapter();
    listView.setAdapter(adapter);

- 通过ListView、BaseAdapter以及相关继承关系的类的源码进行分析

有注释的地方为主要分析部分(主要代码)

  //分析主要代码
  /************
   * ListView.class 中
   * class ListView extends AbsListView
  */
public class ListView extends AbsListView{
  @Override
    public void setAdapter(ListAdapter adapter) {  //传入一个adapter
        super.setAdapter(adapter);
        if (mAdapter != null) { // 适配器不为空时      
            //分析1
            mDataSetObserver = new AdapterDataSetObserver();//在这里实例化一个适配器观察者集合
            //分析2
            mAdapter.registerDataSetObserver(mDataSetObserver);//给适配器注册一个数据适配器观察者
         }
    }
  }


 /************
   AbsListView.class 中    
 */
 public abstract class AbsListView extends AdapterView{
     //这两个引用会被ListView继承以及实例化和调用
     AdapterDataSetObserver mDataSetObserver;
     ListAdapter mAdapter;
     //AdapterDataSetObserver为AbsListView的内部类
     // "分析1 "作用:实现onChanged() onInvalidated()两个方法
     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();
            }
        }
    }
 }

/*********************** Adapter 的相关类
*BaseAdapter.class 中
*/
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
    //实例化DataSetObservable()
    private final DataSetObservable mDataSetObservable = new DataSetObservable();
    private CharSequence[] mAutofillOptions;
    public boolean hasStableIds() {
        return false;
    } 
    //注册观察者
    //"分析2" 时调用
    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }
    //注销观察者
    public void unregisterDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.unregisterObserver(observer);
    }
    //notify 通知数据改变
    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }
 }
/*****
   ListAdapter.class 中
*/
 public interface ListAdapter extends Adapter {
      public boolean areAllItemsEnabled();
      boolean isEnabled(int position);
 }



/**********************
 *DataSetObservable.class 中
   是Observable的子类
   可以调用mObservers集合
 */
 public class DataSetObservable extends Observable<DataSetObserver> {
    public void notifyChanged() {
        synchronized(mObservers) {   
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onChanged();
            }
        }
    }
    public void notifyInvalidated() {
        synchronized (mObservers) {
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onInvalidated();
            }
        }
    }
}


/*********
  Observable.class 中
*/
public abstract class Observable<T> {
    //观察者集合 list,用于存放所有的观察者,会被子类调用
    protected final ArrayList<T> mObservers = new ArrayList<T>();
    //注册观察者
    public void registerObserver(T observer) {
        if (observer == null) {
            throw new IllegalArgumentException("The observer is null.");
        }
        synchronized(mObservers) {
            if (mObservers.contains(observer)) {
                throw new IllegalStateException("Observer " + observer + " is already registered.");
            }
            //添加进list中
            mObservers.add(observer);
        }
    }
    //注销
    public void unregisterObserver(T observer) {
        if (observer == null) {
            throw new IllegalArgumentException("The observer is null.");
        }
        synchronized(mObservers) {
            int index = mObservers.indexOf(observer);
            if (index == -1) {
                throw new IllegalStateException("Observer " + observer + " was not registered.");
            }
            //从list中移除
            mObservers.remove(index);
        }
    }
    public void unregisterAll() {
        synchronized(mObservers) {
            mObservers.clear();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值