Adapter接口及实现类
Adapter本身只是一个接口,它派生了ListAdapter和SpinnerAdapter两个子接口,其中ListAdapter为AbsListView提供列表项,而SpinnerAdapter为AbsApinner提供列表项。Adapter接口及其实现关系类图如图所示:

从类图中可以看出Adapter都继承了BaseAdapter,而BaseAdapter同时实现了ListAdapter、SpinnerAdapter两个接口,因此BaseAdapter及其子类可以同时为AbsListView、AbsSpinner提供列表项。
Adapter常用的实现类如下:
- ArrayAdapter:简单、易用的Adapter,通常用于将数组或List集合的多个值包装成多个列表项。
- SimpleAdapter:并不简单、功能强大的Adapter,可用于将List集合的多个对象包装成多个列表项。
- SimpleCursorAdapter:与SimpleAdapter基本相似,只是用于包装Cursor提供的数据。
- BaseAdapter:通常用于被扩展。扩展BaseAdapter可以对各列表项进行最大限度的定制。
实例:使用ArrayAdapter创建ListView
下面的实例在界面布局文件中定义了两个ListView
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<!-- 设置红色的分隔条 -->
<ListView android:id="@+id/list1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="#f00"
android:dividerHeight="2px"
android:headerDividersEnabled="false"></ListView>
<ListView android:id="@+id/list2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="#0f0"
android:dividerHeight="2px"
android:headerDividersEnabled="false"></ListView>
</LinearLayout>
上面的布局文件定义了两个ListView,但这两个ListView都没有指定android:entries属性,这意味着它们都需要通过Adapter来提供列表项。
接下来Activity为两个ListView提供Adapter,Adapter决定ListView所显示的列表项。程序如下:
package org.crazyit.helloworld; import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.*; public class ListViewTest2 extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_view_test2);
ListView list1=(ListView)findViewById(R.id.list1);
//定义一个数组
String[] arr1=new String[]{"孙悟空","猪八戒","牛魔王"};
//将数组包装为ArrayAdapter
ArrayAdapter<String> adapter1=new ArrayAdapter<String>(this,R.layout.array_item,arr1);
//为ListView设置Adapter
list1.setAdapter(adapter1);
ListView list2=(ListView)findViewById(R.id.list2);
//定义一个数组
String[] arr2=new String[]{"Java","Hibernate","Spring","Android"};
//将数组包装为ArrayAdapter
ArrayAdapter<String> adapter2=new ArrayAdapter<String>(this,R.layout.checked_item,arr2);
//为ListView设置Adapter
list2.setAdapter(adapter2);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.list_view_test2, menu);
return true;
} }
上面的程序中两行粗体字代码创建了两个ArrayAdapter,创建ArrayAdapter时必须指定如下三个参数。
- Context:这个参数无须多说,它代表了访问整个Android应用的接口。几乎创建所有组件都需要传入Context对象。
- textViewResourceId:一个资源ID,该资源ID代表一个TextView,该TextView组件将作为ArrayAdapter的列表项组件。
- 数组或List:该数组或List将负责为多个列表项提供数据。
从上面的介绍不难看出,创建ArrayAdapter时传入的第二个参数控制每个列表项的组件,第三个参数负责为列表项提供数据。该数组或List包含多少个元素,将生成多少个列表项,每个列表项都是TextView组件,TextView组件显示的文本由数组或List的元素提供。
以上面的代码中第一个ArrayAdapter为例,该ArrayAdapter对应的数组为{“孙悟空”,"猪八戒","牛魔王"},该数组将会负责生成一个包含三个列表项的ArrayAdapter,每个列表项的组件外观有R.layout.array_item布局文件(该布局文件只是一个TextView组件)控制,第一个TextView列表项显示的文本为“孙悟空”,第二个TextView列表项显示的文本为“猪八戒”......
R.layout.array_item布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/TextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="24dp"
android:padding="10px"
android:shadowColor="#f0f"
android:shadowDx="4"
android:shadowDy="4"
android:shadowRadius="2" >
</TextView>
R.layout.checked_item布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/TextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="24dp"
android:checkMark="@drawable/ok"
android:shadowColor="#f0f"
android:shadowDx="4"
android:shadowDy="4"
android:shadowRadius="2" >
</CheckedTextView>
运行上面的代码出现下图效果:

Adapter接口及实现类的更多相关文章
- UI组件之AdapterView及其子类关系,Adapter接口及事实上现类关系
AdapterView本身是一个抽象基类,它派生的的子类在使用方法上十分类似.AdapterView直接派生的三个子类:AbsListView.AbsSpinner,AdapterViewAnimat ...
- Android开发10.1:UI组件适配器AdapterView(创建ListView,Adapter接口)
@version:Android4.3 API18 @author:liuxinming 概述 AdapterView继承了ViewGroup,它的本质是容器 ...
- 【无私分享:ASP.NET CORE 项目实战(第二章)】添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 上一章,我们介绍了安装和新建控制器.视图,这一章我们来创建个数据模型,并且添加接口和实现类. 添加EF上下文对象 按照我们以前 ...
- spring的依赖注入,为什么用接口的实现类而不是父类的继承类?
@Resource private EmployeeService employeeService; public void setEmployeeService(EmployeeService em ...
- Java基础-多线程编程-1.随便选择两个城市作为预选旅游目标。实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市。分别用Runnable接口和Thread类实现。
1.随便选择两个城市作为预选旅游目标.实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市.分别用Runnable接口和Thread ...
- QueryRunner类 的應用,以及ResultSetHandler 接口的实现类
1 .该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式. ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql. ...
- C#动态编译代码,执行一个代码片段,或者从指定文件中加载某个接口的实现类
在项目进行中有时候会需要配置一些复杂的表达式,在程序运行的时候执行表达式,根据结果执行相应的操作,简单写了一个类Expression,利用.net的动态编译技术实现,代码如下: public clas ...
- 使用Json.Net处理json序列化和反序列化接口或继承类
以前一直没有怎么关注过Newtonsoft的Json.Net这个第三方的.NET Json框架,主要是我以前在开发项目的时候大多数使用的都是.NET自带的Json序列化类JavaScriptSeria ...
- List 接口以及实现类和相关类源码分析
List 接口以及实现类和相关类源码分析 List接口分析 接口描述 用户可以对列表进行随机的读取(get),插入(add),删除(remove),修改(set),也可批量增加(addAll),删除( ...
随机推荐
- 方便android开发网站:
可以通过输入包名或者Google Play地址消灾google市场的应用 http://apps.evozi.com/apk-downloader/ 16进制转常用的10进制 http://www.b ...
- PHP模板解析类实例
作者:mckee 这篇文章主要介绍了PHP模板解析类,涉及php针对模板文件的解析与字符串处理的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 <?php class template { ...
- mknod用法以及主次设备号【转】
转自:http://www.cnblogs.com/hnrainll/archive/2011/06/10/2077583.html mknod 用途 创建特殊文件. mknod Name { b | ...
- zepto的源代码注释(转)
/* Zepto v1.0-1-ga3cab6c - polyfill zepto detect event ajax form fx - zeptojs.com/license */ ;(funct ...
- Python+Selenium使用Page Object实现页面自动化测试
Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题 等),这样在Selenium测试页面中可以通 ...
- CodeForces 616A Comparing Two Long Integers
水题 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; +; ...
- IO口输入输出模式理解
1.IO输入输出模式 2.有上拉,下拉,弱上拉,推挽,开漏输出:不同的单片机有不同的输出模式 3.以最简单的51单片机为例 P0:开漏型双向IO口,通常需要添加外部上拉电阻 P1~P3:准双向IO口, ...
- 如何用70行Java代码实现深度神经网络算法
http://www.tuicool.com/articles/MfYjQfV 如何用70行Java代码实现深度神经网络算法 时间 2016-02-18 10:46:17 ITeye 原文 htt ...
- HDU 5611 Baby Ming and phone number
#include<cstdio> #include<cstring> #include<vector> #include<cmath> #include ...
- tableView滑动到底部
- (void)scrollToBottom { NSInteger sectionCount = [self.dataSource numberOfSectionsInTableView:self] ...