ListView与Adapter之间的观察者模式
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之间的观察者模式相关推荐
- Android listview与adapter用法
2019独角兽企业重金招聘Python工程师标准>>> 一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListVi ...
- Android ListView与Arrayadapter之间的搭配使用
在做安卓开发的时候很多时候都要用到ListView来显示数据,ListView使用的也很广泛,用到了ListView就会使用到adapter适配器,关键就在于adapter,刚开始学安卓的时候就根本不 ...
- Android控件——ListView之Adapter提供数据(其二)
2019独角兽企业重金招聘Python工程师标准>>> 上一节中一些列表集合数据到手机屏幕时,通常采用ListView组件+ArrayAdapter. 虽然它能为我们提供展示数据列表 ...
- ListView.setAdapter(adapter);空指针异常的解决的总结
ListView.setAdapter(adapter);空指针异常的解决的总结 参考文章: (1)ListView.setAdapter(adapter);空指针异常的解决的总结 (2)https: ...
- listview与adapter用法
Android listview与adapter用法 listview与adapter用法 博客分类: android 一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的 ...
- Android记录15--关于ListView中adapter调用notifyDataSetChanged无效的原因
Android记录15--关于ListView中adapter调用notifyDataSetChanged无效的原因 2014年1月16日 开发记录 话说这个问题已经困扰我很久了,一直找不到原因,我以 ...
- Kotlin ListView设置Adapter
直接上代码. 1.附上Activity代码 package com.example.chehang168.kotlindemoimport android.view.View import andro ...
- android 中自定义安装,Android开发中ListView自定义adapter的封装
[引入] 我们一般编写listView的时候顺序是这样的: •需要展示的数据集List •为这个数据集编写一个ListView •为这个ListView编写一个Adapter,一般继承自BaseAda ...
- Android listview和adapter
ListView 和 Adapter的关系: 就是将ListView绑定的界面中的数据与adapter相适配 MainActivity.java package com.example.listvie ...
最新文章
- 另一鲜为人知的单例写法-ThreadLocal
- 今天微软关闭Silverlight官网,Sivlerlight真得要死了吗?
- C++模版和C#泛型求同存异录(一)sizeof(T)
- 无服务器:SLAppForge Sigma入门
- 【华为云技术分享】【DevCloud· 敏捷智库】物理看板和电子看板该如何选择?(内附下载材料)
- Android开发笔记(八十)运行状态检查
- HCIE Security 单包攻击防范 备考笔记(幕布)
- EXCEL VBA编程进阶-曾贤志-专题视频课程
- 专访数据挖掘领头人韩家炜教授:不要迷信权威,做学问要秉承「三个真实」...
- 如何做决策?SWOT分析
- 烽火2640路由器命令行手册-04-网络协议配置命令
- c语言里10h代表什么,汇编中的10H中断int 10h详细说明
- android一些可用实例2014收藏
- App地推营销成为趋势,破局增长数据赋能是关键
- 计算机app无法删除,电脑软件卸载不掉怎么办?软件删除不掉解决技巧
- JAVA中的protected的访问权限只有在本类同包类和子类吗?
- 打印机显示域服务器,操作打印机提示“active directory域服务当前不可用”怎么办?...
- 【最新】CentOS7.8 部署redis6.0.1集群
- 伞源科技Pinpoint和sonarQube对比
- 许键树:华为云视频直播在各细分场景的体验指标优化实践