浅谈安卓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

相关文章

【杂记-浅谈DHCP动态主机配置协议】

DHCP动态主机配置协议 一、DHCP概述1、定义2、作用3、报文类型 二、DHCP的工作原理三、DHCP服务器的配置和管理 一、DHCP概述 1、定义 DHCP,Dynamic Host Configuration Protocol,动态主机配置协议,是一种网络协议,主要用于在IP网络中自动分配和管理IP地址以及其他网络配置参数。 2、作用 DHCP允许计算机和其他设备通

浅谈 MySQL for excel

欢迎关注微信公众号“Python生态智联”  MySQL for excel是一个大小只有几兆的MySQL附件,它能让我们在Microsoft excel中处理MySQL数据。小编用了两天时间浏览了MySQL for excel的使用指南并按demo演示了一遍(手册地址https://dev.mysql.com/doc/mysql-for-excel/en/),现从功能和局限两方面对MySQL

Android必学之数据适配器BaseAdapter

https://www.cnblogs.com/caobotao/p/5061627.html

潜艇伟伟迷杂交版植物大战僵尸2024最新免费安卓+ios苹果+iPad分享

嗨,亲爱的游戏迷们!今天我要给你们种草一个超有趣的游戏——植物大战僵尸杂交版。这款游戏不仅继承了原有经典游戏的核心玩法,还加入了许多创新元素,让玩家能够体验到前所未有的乐趣。快来跟随我一起探索这个神奇的世界吧! 植物大战僵尸杂交版最新绿色版下载链接: https://pan.quark.cn/s/d60ed6e4791c 🔥 创新与经典的完美结合 植物大战僵尸杂交版在保持了原游戏经典玩

二本毕业,我是如何成为BAT-安卓开发工程师?

1.对基础原理不断挖掘 进入公司,我的职位是Linux应用开发工程师,做App网络传输模块,本质上就是把本地的数据通过socket传输到服务端。用到的技术是C语言,网络编程,多线程编程。 那时是最痛苦的几个月,因为非计算机出生,很多东西都不会,经常程序段错误,都不能定位到问题代码。 当时处于试用期间,秉承着不成功则成仁的心态开始恶补相关的基础知识以及代码规范。那时网络上没有现成的视频资料,艰

2021-02-16物料档案条码添加和蓝牙条码标签打印,金蝶安卓盘点机PDA,金蝶仓库条码管理WMS系统

物料档案条码添加和蓝牙条码标签打印,金蝶安卓盘点机PDA https://member.bilibili.com/platform/upload-manager/article 本期视频我们来讲解一下汉点机PDA条码添加和条码标签蓝牙便携打印: 在实际使用中,我们商品有两种情况: 一种是商品本身就有条码, 比如:超市卖的可口可乐,牛奶等商品,商品本身就有69开头的国标码,那么我们就可以使用盘点

仓库盘点好方法,使用安卓盘点机PDA扫描商品条码进行超市盘点

仓库管理我们为什么要盘点? 因为传统的进销存出入库都需要电脑一行行的人工手工录单,比如入库时,人眼识别这个商品是什么商品,然后电脑上选择该商品,录入数量。人眼识别要求入库人对商品非常熟悉,而且对于包装规格相近的很容易弄错,张冠李戴,A商品的录单时记录成为B商品了。所以人工手工录单效率低,误差大,是导致我们进销存管理软件中帐面库存存跟仓库门店实际库存不相符合的主要原因。电脑账存跟实际库存不符合,所

cpp随笔——浅谈右值引用,移动语义与完美转发

右值引用 什么是右值 在cpp11中添加了一个新的类型叫做右值引用,记作&&,而在开始今天的正文之前我们先来看一下什么是左值什么是右值: 左值(&):存储在内存中,有明确存储地址的数据右值(&&):临时对象,可以提供数据(不可取地址访问) 而在cpp11中我们可以将右值分为两种: 纯右值:非引用返回的临时变量,比如运算表达式产生的临时变量,原始字面量以及lambda表达式等将亡值:与右值

高通安卓12-安卓系统定制2

将开机动画打包到system.img里面 在目录device->qcom下面 有lito和qssi两个文件夹 现在通过QSSI的方式创建开机动画,LITO方式是一样的 首先加入自己的开机动画,制作过程看前面的部分 打开qssi.mk文件,在文件的最后加入内容 PRODUCT_COPY_FILES += $(LOCAL_PATH)/bootanimation.zip:$(TA

macbook配置adb环境和用adb操作安卓手机

(参考:ADB工具包的安装与使用_adb工具箱-CSDN博客) 第一步:从Android开发者网站下载Android SDK(软件开发工具包)。下载地址为: 第二步:解压下载的SDK压缩文件到某个目录中。 进入解压后的目录,找到其中的"platform-tools"文件夹。记录"platform-tools"文件夹路径: 第三步:将"platform-tools"文件夹的路径添加到系