Android 中基于BaseAdapter 的适配器理解

2015-12-10 12:23欧杵乡
电脑知识与技术 2015年26期
关键词:适配器

摘要:基于Android应用程序的开发,系统界面不仅形式多样,内容上也越来越丰富,这些特点都得利于适配器的使用。BaseAdapter最大的特点是灵活而优雅,开发人员可以轻松的构造BaseAdapter并将其搭载到所需的控件中去,从而使系统呈现不同的效果。该文从BaseAdapter的构造过程阐述了适配器的原理并通过程序实现适配器搭载不同UI界面控件的过程。

关键词:Android;BaseAdapter;适配器

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)26-0085-03

Based on BaseAdapter Adapter to Understand in the Android

OU Chu-xiang

(Guangzhou Railway Polytechnic, Guangzhou 510430, China)

Abstract: Application development based-on Android not only presented in various forms, also enriched in its contents, all this can contributed to the use of an adapter. The most important feature of BsedAdapter is flexible and elegant, which can be easily constructed and implied to the needed controlers thus making a various appearing effect by the developers. The theory of construction of BaseAdapter and the programmed process of different UI interface controllers equipped with the adapter is proposed in this paper.

Key words: Android; BaseAdapter; the adapter

1 概述

在Android软件开发学习中,适配器模式(Adapter Pattern)是必须学习的。GOF(Gang of four)的《Design Pattern》中设配器模式定义:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法再一起工作的两个类能够在一起工作[1]。理解这段定义,我们可以从手机充电方面去理解。手机充电器可以看作一个适配器,而220V交流电电源是一个类,手机是另一个类,手机需要的电压是5.0V电压,所以在充电时需要一个变压器(充电器)将220V电压转换成手机所需的5.0V电压,这正像是适配器所做的事。

BaseAdapter在Android引用程序中应用非常广泛,它是一个基础数据适配器,其用途是将一组杂乱的数据按照一定的规则应用到ListView、Spinner、Gallery和GridView等UI界面组件中。也就是说,Adapter可以看作数据源和UI界面组件之间数据沟通的桥梁,如图1所示:

图 1

2 对原生Adapter的理解

在开发过程中,程序员会经常使用Adapter,因此谷歌公司给Android定义了一些原生的Adapter。这些原生的Adapter不仅负责提供数据,而且还负责创建每一个条目的视图,所以我们可以轻松的引用这些Adapter。原生的Adapter最有用、最常用的主要有以下两个:

1)ArrayAdapter类

ArrayAdapter类继承了BaseAdapter类,利用JAVA泛型来定义绑定的数据类型对象,从而从数据类型对象的toString方法获得相应的值,用来创建和填充文本视图。

2)SimpleCursorAdapter类

SimpleCursorAdapter类的基类同样也是BaseAdapter类,它可以把一个布局中的视图和(通常从Content Provider 查询返回的)游标的特定列绑定在一起[2]。

3 创建一个自己的适配器

既然前面讲的ArrayAdapter类和SimpleCursorAdapter类的基类是BaseAdapter类,那么我们就可以依照这两个类来编写自己的Adapter。在继承BaseAdapter类之后,我们需要实现getCount()、getItem()、getItemId()和getView()几个方法。其中getCount()返回列表项的长度;getItem()返回指定列表项数据;getItemId()返回指定列表项在列表中的位置;getView()返回指定的列表视图。具体代码如下:

public class StructureAdapter extends BaseAdapter

{

//初始化数据

private List mList;

private Context mContext;

private LayoutInflater mInflater;

public StructureAdapter(List list, Context context)

{

数据库与信息管理
大数据研究综述
高校虚拟实验室的数据中心建设研究
北斗定位接收机数据云检测平台的设计与实现
基于数据挖掘技术的五年制高职录取
数据挖掘技术在大学生心理测评数据中研究应用
网络通讯及安全
基于通讯工程的网络服务质量监测和控制研究
网页中超链接的路径
基于策略优化的计算机网络管理技术研究
搜索引擎应对垃圾网页的技术研究
一种IMS 网络的网络安全监控和防范处理方法
模糊Petri 网及其在高铁信号系统故障诊断的应用
网络安全事件应急处置与管理平台的设计与实现
基于MOOC 的学习支持研究
电子信息资源开发利用方法的若干研究
高校混合云存储的研究与实践
浅谈校园APP 在高职院校学生活动中的应用
Windows 8 系统中的USB 设备连接时间戳问题的研究
关于云桌面技术和建设方案设计的探究
“Linux 内核定制”实验教学改革与探索
网络安全技术在企业管理中的应用
浅析中小学校园网站建设现状及前景展望
二维码相关技术研究
软件设计开发
基于web的高职院校在线考试系统探讨
食品生产线的计算机控制系统设计与实现
课程信息化平台系统设计
C 语言教学方法探讨
基于GIS 的车辆管理系统设计与实现
基于学生成绩的教学质量管理系统开发
学分制环境下正方教务管理系统优化与完善
基于UML 图书销售系统分析与设计
高职院校薪酬绩效管理系统财务报表预审核机制研究
PHP+Smarty 环境下Ajax 中文查询的研究
基于Android 平台的评分系统
排序算法的性能分析
基于移动平台APP 测试
基于Flash ActionScript 的汉字书写软件的设计与实现
高校网站群建设中信息安全保障的探索
Android 中基于BaseAdapter 的适配器理解
数字校园中基于云计算的移动学习平台研究
基于Android 的LBS 移动就业系统的设计与实现
手机远程控制多媒体系统的设计
基于AIDE 的Android 程序开发教学设计
浅析计算机二级培训中Vlookup 函数教学的策略与实践
基于Swing 的方块游戏关键技术的研究与实现
面向Android 系统安全的在线学习算法研究
高校试题库建设实践与探讨
计算机教学与教育信息化
基于应用型人才培养的计算机专业课程体系研究
云计算辅助教学调查分析
中职学校开展移动互联网人才培养的探讨
电子类专业C语言程序设计课程教学改革的探索
基于校企联合办学的计算机专业教学改革
软件工程课程的几种教学方法探讨?
“游戏导学 合作学习”在高师课堂教学中的应用
物联网专业“RFID技术与应用”课程改革与实践
论MOOC环境下高职生信息素养的培养
Web Service在教学工作量管理系统中的应用研究
互联网条件下教研模式探索
“PHP程序设计”项目课程的开发与实践
提升C语言对土木工程专业辅助性作用教学实践研究
地方性院校《数据结构》课程教学探索
大学计算机基础课程教学现状与教学方法改革对策
模拟电路实验教学的改革与实践
非计算机专业C语言程序设计“教学做考”一体化教学的探索
人工智能及识别技术
基于GPS 和GSM 的多功能智能拐杖设计
基于灰度特征的非结构化道路分割
智慧酒店的开发与应用
约束最小二乘法实现退化图像复原
基于i.MX28的物联网智能网关设计
图像处理系统的设计与实现
基于线阵CCD 的智能微小位移测量系统设计
多媒体技术及其应用
基于三维全景的虚拟旅游系统开发研究
基于FLASH 的多媒体交互课件设计与制作
浅谈微课教学设计
高校多媒体教室管理运行模式创新探究
摄像机三维技术在AE 视频特效中的应用
Simulink 及图形用户界面GUI 下的电子技术仿真平台构建探讨
关于数字电视系统嵌入式浏览器的运用
计算机工程应用技术
基于STC12C5A16S2的药品通风柜的设计
一种基于负反馈的协同过滤推荐系统
基于虚拟实验平台温度测控系统的设计与实现
面向高阶调制的低复杂度MIMO 检测技术
基于FPGA 的液晶显示屏的伽马校正研究
基于PLC 控制的垂直式回转刀具库管理系统设计
栅栏效应在连续周期信号谱分析中的研究
基于HFSS 的微带天线建模仿真研究
基于52单片机智能手机充电器的应用研究
基于无线射频脉冲无触点开关的设计与实现
基于16QAM/PPM 调制的OCDM—PON 系统分析
基于粒子系统的喷泉模拟实现
烟草企业运营监控体系研究
基于OpenCV 的PCB 元件缺陷检测
虚拟现实技术在网络博物馆中的应用与实现
电子商务与电子政务
基于物联网、云计算的环境监控体系设计及应用
我国电子信息工程的发展及有效保障
基于物联网技术的信息化应用研究
公司地址: 北京市西城区德外大街83号德胜国际中心B-11

客服热线:400-656-5456  客服专线:010-56265043  电子邮箱:longyuankf@126.com

电信与信息服务业务经营许可证:京icp证060024号

Dragonsource.com Inc. All Rights Reserved

icp

super();

this.mList = list;

this.mContext = context;

//获取到当前视图压力泵

mInflater = LayoutInflater.from(mContext);

}

@Override

public int getCount()

{

return mList.size();

}

@Override

public Object getItem(int position)

{

return mList.get(position);

}

@Override

public long getItemId(int position)

{

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent)

{

return mInflater.inflate(resource, null);

}

}

在这里,我们应该重点去完成getView()的代码实现,在实现代码前,还需要去创建一个XML的试图文件和一个数据类型对象模型的Java文件,XML也就是代码中resource。这里创建一个简单的视图文件Item.xml,视图中有一个ImageView和两个TextView,布局如图2:

图 2

数据类型对象模型的Java文件可以创建一个ItemModel.java文件,代码如下:

public class ItemModel

{

public int ItemImageResId;

public String ItemTitle;

public String ItemContent;

public ItemModel (int itemImageResId, String itemTitle, String itemContent)

{

super();

ItemImageResId = itemImageResId;

ItemTitle = itemTitle;

ItemContent = itemContent;

}

}

1)简单实现视图代码

在实现getView()里面代码时,我们不考虑其他情况的前提下,可以这样实现代码:

public View getView(int position, View convertView, ViewGroup parent)

{

View view = mInflater.inflate(R.layout.item, null);

ImageView imageView = (ImageView) view .findViewById(R.id.iv_image);

TextView title = (TextView)view.findViewById(R.id.tv_title);

TextView content = (TextView)view.findViewById(R.id.tv_content);

ItemModel model= mList.get(position);

imageView.setImageResource(model.ItemImageResId);

title.setText(model.ItemTitle);

content.setText(model.ItemContent);

return view;

}

这种实现方式可以清晰的表述出适配器所绑定的视图,利于初学者理解Adapter原理。但这种方式也有其弊端,因为它没有充分考虑到Android所运行的性能环境,Android所运行的环境中硬件资源是有限的,像上述代码在运行时会重复创建视图资源,消耗大量的内存资源。因此,我们必须优化代码,减少资源的消耗。其实在Android中有一个Recycler构

建,可以帮助优化代码。我们结合getView()方法来看Recycler的工作原理[3],如图3:

图3

从图3中可以看出,Recycler构建就是在滑动屏幕后,当Item1滑动出屏幕,将其重新构建视图及赋值产生出Item8,达到重复利用的效果,减少硬件资源的消耗。

2)优化视图实现代码

public View getView(int position, View convertView, ViewGroup parent)

{

if (convertView == null)

{

//view未被实例化,缓存池中没有view的缓存,所以需要新建

convertView = mInflater.inflate(R.layout.item, null);

}

ImageView imageView = (ImageView) convertView .findViewById(R.id.iv_image);

TextView title = (TextView)convertView.findViewById(R.id.tv_title);

TextView content = (TextView)convertView.findViewById(R.id.tv_content);

ItemModel model= mList.get(position);

imageView.setImageResource(model.ItemImageResId);

title.setText(model.ItemTitle);

content.setText(model.ItemContent);

return convertView;

}

代码实现虽然只多写一段条件判断代码,但这段代码才是整个getView()方法的核心。在条件判断为真的时候,内部去创建视图,避免视图的重复被创建。

以上代码在Eclipse、Android SDK4.1环境下开发,在SDK4.3、SDK5.1等调试通过。

4 结束语

设计Adapter时需要有代码重构的思想,这也符合面向对象程序设计思想,针对特有的接口设计Adapter可以解决数据与UI界面组件不匹配的情况。在设计时也需要考虑资源的消耗问题,优化我们的Adapter。

参考文献:

[1] GOF. Design Patterns: Elements of Reusable Object-Oriented Software[M]. Pearson Education,2000:95-96.

[2] Reto Meier.Android 4 高级编程[M].3版.北京:清华大学出版社,2013:138.

[3] Satya Komatineni,Dave MacLean.精通Android[M]. 北京:人民邮电出版社,2013:127-131.

猜你喜欢
适配器
基于超声相控阵的卫星适配器缺陷检测方法研究
适配器模式及其应用
基于3D打印的轻型导弹适配器
新型水文测验GPS适配器设计与应用
基于蓝牙串口适配器的GPS接收机与AutoCAD的实时无线通信
美国麦格普公司新型M—LOK相机三脚架适配器