浅谈安卓BaseAdapter

2024-02-02 03:58
文章标签 浅谈 安卓 baseadapter

本文主要是介绍浅谈安卓BaseAdapter,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

一:继承结构

经常用Adapter,今天抽出点时间看看BaseAdapter的源码,抽象类BaseAdapter实现了ListAdapter,SpinnerAdpter接口,ListAdapter和SpinnerAdpter均继承自Adapter接口,组织结构如下图所示:

由于BaseAdapter实现ListAdapter ListAdapter,SpinnerAdpter的时候并没有重写这四个抽象方法,所以转给BaseAdapter的子类去实现.

至于ListAdapter 中只有两个抽象方法:

 public boolean areAllItemsEnabled();boolean isEnabled(int position);

BaseAdapter已经重写这两个方法并且返回true,权限为public,所以我们自己的适配器可以使用这两个方法,决定条目是否Enabled.

最后一个SpinnerAdpter spinner是纺纱工的意思,纺纱工适配器,意思时不断的像纺纱机一样刷新视图.这个适配器只有一个抽象方法:

public View getDropDownView(int position, View convertView, ViewGroup parent);

BaseAdapter 中重写了该方法:

 public View getDropDownView(int position, View convertView, ViewGroup parent) {return getView(position, convertView, parent);}

BaseAdapter 中除了四个需要继承者需要实现的方法外,其余Adapter抽象方法均已重写,其中两个方法,

notifyDataSetChanged() 和notifyDataSetInvalidated() 是BaseAdapter自己独有的方法.

二:BaseAdpter数据绑定

BaseAdapter 的数据绑定用到了观察者模式,DataSetObserver,DataSetObservable,Observable

DataSetObserver源码:

public abstract class DataSetObserver {/*** 当整个数据集发生更改时调用此方法*/public void onChanged() {// Do nothing}/*** 当整个数据无效时调用此方法*/public void onInvalidated() {// Do nothing}

DataSetObservable源码:其中用到了synchronized,因为ArrayList是线程不安全的,如果ArrayList换做Vector (线程安全,效率低)也是可以的,此时就不需要synchronized了.

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源码:

public abstract class Observable<T> {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.");}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.");}mObservers.remove(index);}}/*** 移除所有已注册的观察者*/public void unregisterAll() {synchronized(mObservers) {mObservers.clear();}}
}

注释已经翻译为中文.

BaseApter在notifyDataSetChanged()方法中调用:mDataSetObservable.notifyChanged(),当数据发生变化时调用notifyDataSetChanged()方法,刷新视图.

    private final DataSetObservable mDataSetObservable = new DataSetObservable();public void registerDataSetObserver(DataSetObserver observer) {mDataSetObservable.registerObserver(observer);}public void unregisterDataSetObserver(DataSetObserver observer) {mDataSetObservable.unregisterObserver(observer);}public void notifyDataSetChanged() {mDataSetObservable.notifyChanged();}public void notifyDataSetInvalidated() {mDataSetObservable.notifyInvalidated();}

至此BaseAdapter的组织结构和数据结构已经展示完毕,且看下次分析Adapter如何与ListView 进行绑定,即:setAdapter方法.

BaseAdapter 数据绑定用到了观察者模式,观察者模式可参考我的另一篇博客:

https://blog.csdn.net/startCrazyActivity/article/details/81369196

欢迎大家留言评论,共同学习进步.

 

这篇关于浅谈安卓BaseAdapter的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/669396

相关文章

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

Spring核心思想之浅谈IoC容器与依赖倒置(DI)

《Spring核心思想之浅谈IoC容器与依赖倒置(DI)》文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyB... 目录一、控制反转 IoC二、依赖倒置 DI1. 详细概念2. Spring 中 DI 的实现原理三、

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法   消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法 [转载]原地址:http://blog.csdn.net/x605940745/article/details/17911115 消除SDK更新时的“

浅谈PHP5中垃圾回收算法(Garbage Collection)的演化

前言 PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection)。现在如果去PHP官方网站(php.net)可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.3版本对5.2并不是完

安卓玩机工具------小米工具箱扩展工具 小米机型功能拓展

小米工具箱扩展版                     小米工具箱扩展版 iO_Box_Mi_Ext是由@晨钟酱开发的一款适用于小米(MIUI)、多亲(2、2Pro)、多看(多看电纸书)的多功能工具箱。该工具所有功能均可以免root实现,使用前,请打开开发者选项中的“USB调试”  功能特点 【小米工具箱】 1:冻结MIUI全家桶,隐藏状态栏图标,修改下拉通知栏图块数量;冻结

安卓开发板_联发科MTK开发评估套件串口调试

串口调试 如果正在进行lk(little kernel ) 或内核开发,USB 串口适配器( USB 转串口 TTL 适配器的简称)对于检查系统启动日志非常有用,特别是在没有图形桌面显示的情况下。 1.选购适配器 常用的许多 USB 转串口的适配器,按芯片来分,有以下几种: CH340PL2303CP2104FT232 一般来说,采用 CH340 芯片的适配器,性能比较稳定,价

浅谈java向上转型和乡下转型

首先学习每一种知识都需要弄明白这知识是用来干什么使用的 简单理解:当对象被创建时,它可以被传递给这些方法中的任何一个,这意味着它依次被向上转型为每一个接口,由于java中这个设计接口的模式,使得这项工作不需要程序员付出任何特别的努力。 向上转型的作用:1、为了能够向上转型为多个基类型(由此而带来的灵活性) 2、使用接口的第二个原因却是与使用抽象基类相同,防止客户端创建该类的对象,并确保这仅仅

安卓实现弹出软键盘屏幕自适应调整

今天,我通过尝试诸多方法,最终实现了软键盘弹出屏幕的自适应。      其实,一开始我想通过EditText的事件来实现,后来发现,安卓自带的函数十分强大,只需几行代码,便可实现。实现如下:     在Manifest中设置activity的属性:android:windowSoftInputMode="adjustUnspecified|stateHidden|adjustResi