ListView与Adapter之间的观察者模式

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

  • 首先创建一个MyAdapter继承BaseAdapter
public class MyAdapter extends BaseAdapter {private List<String> list;public MyAdapter(List<String> list) {this.list = list;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic 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{@Overridepublic void setAdapter(ListAdapter adapter) {  //传入一个adaptersuper.setAdapter(adapter);if (mAdapter != null) { // 适配器不为空时      //分析1mDataSetObserver = new AdapterDataSetObserver();//在这里实例化一个适配器观察者集合//分析2mAdapter.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 {@Overridepublic void onChanged() {super.onChanged();if (mFastScroll != null) {mFastScroll.onSectionsChanged();}}@Overridepublic 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();}}
}
复制代码

转载于:https://juejin.im/post/5ae57bfa5188256728602205

ListView与Adapter之间的观察者模式相关推荐

  1. Android listview与adapter用法

    2019独角兽企业重金招聘Python工程师标准>>> 一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListVi ...

  2. Android ListView与Arrayadapter之间的搭配使用

    在做安卓开发的时候很多时候都要用到ListView来显示数据,ListView使用的也很广泛,用到了ListView就会使用到adapter适配器,关键就在于adapter,刚开始学安卓的时候就根本不 ...

  3. Android控件——ListView之Adapter提供数据(其二)

    2019独角兽企业重金招聘Python工程师标准>>> 上一节中一些列表集合数据到手机屏幕时,通常采用ListView组件+ArrayAdapter. 虽然它能为我们提供展示数据列表 ...

  4. ListView.setAdapter(adapter);空指针异常的解决的总结

    ListView.setAdapter(adapter);空指针异常的解决的总结 参考文章: (1)ListView.setAdapter(adapter);空指针异常的解决的总结 (2)https: ...

  5. listview与adapter用法

    Android listview与adapter用法 listview与adapter用法 博客分类: android 一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的 ...

  6. Android记录15--关于ListView中adapter调用notifyDataSetChanged无效的原因

    Android记录15--关于ListView中adapter调用notifyDataSetChanged无效的原因 2014年1月16日 开发记录 话说这个问题已经困扰我很久了,一直找不到原因,我以 ...

  7. Kotlin ListView设置Adapter

    直接上代码. 1.附上Activity代码 package com.example.chehang168.kotlindemoimport android.view.View import andro ...

  8. android 中自定义安装,Android开发中ListView自定义adapter的封装

    [引入] 我们一般编写listView的时候顺序是这样的: •需要展示的数据集List •为这个数据集编写一个ListView •为这个ListView编写一个Adapter,一般继承自BaseAda ...

  9. Android listview和adapter

    ListView 和 Adapter的关系: 就是将ListView绑定的界面中的数据与adapter相适配 MainActivity.java package com.example.listvie ...

最新文章

  1. 另一鲜为人知的单例写法-ThreadLocal
  2. 今天微软关闭Silverlight官网,Sivlerlight真得要死了吗?
  3. C++模版和C#泛型求同存异录(一)sizeof(T)
  4. 无服务器:SLAppForge Sigma入门
  5. 【华为云技术分享】【DevCloud· 敏捷智库】物理看板和电子看板该如何选择?(内附下载材料)
  6. Android开发笔记(八十)运行状态检查
  7. HCIE Security 单包攻击防范 备考笔记(幕布)
  8. EXCEL VBA编程进阶-曾贤志-专题视频课程
  9. 专访数据挖掘领头人韩家炜教授:不要迷信权威,做学问要秉承「三个真实」...
  10. 如何做决策?SWOT分析
  11. 烽火2640路由器命令行手册-04-网络协议配置命令
  12. c语言里10h代表什么,汇编中的10H中断int 10h详细说明
  13. android一些可用实例2014收藏
  14. App地推营销成为趋势,破局增长数据赋能是关键
  15. 计算机app无法删除,电脑软件卸载不掉怎么办?软件删除不掉解决技巧
  16. JAVA中的protected的访问权限只有在本类同包类和子类吗?
  17. 打印机显示域服务器,操作打印机提示“active directory域服务当前不可用”怎么办?...
  18. 【最新】CentOS7.8 部署redis6.0.1集群
  19. 伞源科技Pinpoint和sonarQube对比
  20. 许键树:华为云视频直播在各细分场景的体验指标优化实践

热门文章

  1. [编程题]DNA合成
  2. 怎么在计算机上写数学公式,如何在word中计算数学公式
  3. 进制转换小数c语言代码,C语言进制转换小数负数皆可 代码求解释
  4. C语言:strlen() --- 计算字符串长度
  5. JavaScript-178:动态生成表格案例
  6. 给PLC工程师搭个脚手架
  7. 河南省工业互联网大赛(复赛) wp
  8. 转载:浏览器兼容的反思、前端人员的学习之路、Web标准:我们是否一直在错误的道路上越走
  9. hbase+phoenix
  10. 英特尔oneAPI—爱恨情仇之谁与争锋