一.Adapter的理解

(一)基本概念

    首先,我们先要了解什么是Adapter,其实我们一般都可以从翻译中知道一点,这个单词的翻译是“适配器”。也就是说,我们可以通过Adapter把对应的数据放到对应的容器中。这就是Adapter的作用。

(二)Adapter和数据、视图的关系图解

    从上面的图中,我们可以看到,Adapter能把数据做相应的处理,再让它在View中显示出来。
    其实这里的Adapter已经把数据的排列组合关系整理好了,只需要一个能显示Adapter的AdapterView显示出来就可以了。
    在实际应用中,如果要让数据一行一行的显示出来就用AdapterView中的ListView,如果想让数据显示的格式是一格一格的就用AdapterView中的GridView。其中Adapter可以不变,只要改变显示的方式就可以了。当然AdapterView还有其他的显示方式。如图所示:

(三)AdapterView关系图:

    这里的AdapterView要使用Adapter才能显示出多样的效果。否则只能显示简单的文本。

其中ListView和GridView是我们常用的视图界面。
Spinner和Gallary都是在输入框下面显示的视图界面
StackView是以“堆叠”的方式来显示多个列表项的视图界面。

(四)Adapter接口的关系图:

这个Adapter的关系图的要我们记住的,也是本文要介绍的主要内容。
我们常用的Adapter是BaseAdapter接口、以及它的实现类ArrayAdapter和SimpleAdapter。
CursorAdapter是在显示数据库信息时用到的。

    上面这三个图都是我们要知道的。对于常用的名称和关系也是要记住的。

(五)BaseAdapter、ArrayAdapter和SimpleAdapter的区别

ArrayAdapter和SimpleAdapter是BaseAdapter接口的实现类。
    其中ArrayAdapter只能显示简单的文本布局
    SimpleAdapter能显示复杂的布局(里面可以包括多个布局和控件)。
    在实际应用中还经常使用自定义类来实现BaseAdapter接口,设置Adapter,实现更加强大或更加符合需求的Adapter适配器。

(六)使用Adapter和AdapterView

AdapterView其实就是一个View,用来显示视图。
而在显示视图前,必须要做三步:
1.准备好数据源。
2.创建Adapter。
3.把Adapter对象放到AdapterView中,
如:listview.setAdapter(adapter)
其中创建Adapter是最难的,也是最重要的。

二.Adapter的创建和使用

(一)创建ArrayAdapter

通过一个示例来展示ArrayAdapter的使用

1.编辑main_activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><ListView
        android:id="@+id/main_list"android:layout_width="match_parent"android:layout_height="match_parent" /></RelativeLayout>

2.创建一个TextView的XML文件,并编辑

编辑item_text.xml的内容:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/item_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="line"android:textSize="20sp"/>

3.编写代码

package com.example.lesson7_arrayadapter;import java.util.ArrayList;
import java.util.List;import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;public class MainActivity extends Activity {// 数据源List<String> list;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// ListView界面ListView listview = (ListView) findViewById(R.id.main_list);// 示例化list集合list = new ArrayList<String>();// 给数据源存放数据for (int i = 0; i < 50; i++) {list.add("line" + i);}// 创建ArrayAdapter(有四个构造方法,这里不细说)// 第一个参数是上下文,// 第二个参数数TextView的XML布局文件// 第三个参数是数据源(以集合的形式放进去)ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.item_text, list);// 把Adapter放放到ListView中listview.setAdapter(adapter);}}

4.运行程序后,如图所示:

List里面的数据能按照顺序显示出来;往下拉能显示最后的数据。

这里显示的是line0到line49,50条list里面的数据。
其中这里的存放TextView的item_text.xml也可以用java代码直接创建。

(二)创建SimpleAdapter

SimpleAdapter能显示复杂的布局。使用的步骤和上面的程序差不多,只是item_text.xml变成复杂一点的布局文件,创建Adapter需要的数据也要多一点。

1.编辑main_activity.xml(和上面例子一样)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><ListView
        android:id="@+id/main_list"android:layout_width="match_parent"android:layout_height="match_parent" /></RelativeLayout>

2.创建一个XML文件item_list.xml,并编辑

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="100dp"android:paddingTop="10dp" ><ImageView
        android:id="@+id/item_iv"android:layout_width="50dp"android:layout_height="50dp"android:layout_centerVertical="true"android:padding="5dp"android:src="@drawable/email" /><ImageView
        android:id="@+id/item_iv2"android:layout_width="50dp"android:layout_height="50dp"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:padding="5dp"android:src="@drawable/email" /><TextView
        android:id="@+id/item_tv_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_toRightOf="@id/item_iv"android:text="sss" /><TextView
        android:id="@+id/item_tv_content"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:text="aaa" /></RelativeLayout>

    这个布局文件可以是很复杂的,可以是多个布局嵌套,但是尽量少用布局嵌套,因为会消耗很多时间来显示布局。

3.编辑代码

package com.example.lesson7_listview;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;/* * simpleAdapter和ListView的使用*  */public class MainActivity extends Activity {// 数据源// 图片1int[] images = { R.drawable.img01, R.drawable.img02, R.drawable.img03,R.drawable.img04 };// 主题String[] titles = { "锁定手机", "手机杀毒", "手机解锁", "手机上网" };// 图片2int[] images2 = { R.drawable.img04, R.drawable.img05, R.drawable.img06,R.drawable.email };// 文本内容String[] contents = { "专业锁定手机", "专业手机杀毒", "专业手机解锁", "专业手机上网" };// listView布局ListView listView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 实例化ListViewlistView = (ListView) findViewById(R.id.main_lv);// 创建data数据// 这里每一个条目的数据使用的是一个HashMap保存,所以value的值要用Object,可以存放图片数据List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();for (int i = 0; i < 4; i++) {HashMap<String, Object> map = new HashMap<String, Object>();map.put("image", images[i]);map.put("title", titles[i]);map.put("image2", images2[i]);map.put("content", contents[i]);data.add(map);}// HashMap中存放数据的key,后面通过对应的key取数据String[] from = { "image", "title", "image2", "content" };// item_list.xml文件中对应数据要存放到的布局控件的位置int[] to = { R.id.item_iv, R.id.item_tv_title, R.id.item_iv2,R.id.item_tv_content };// 创建SimpleAdapter// 第一个参数是上下文// 第二个参数是适配器的数据// 第三个数据是listView的布局文件// 第四个参数是Adapter里面HashMap里面Key的name// 第五个参数是Adapter里面HashMap里面value的值要存放去的布局的位置SimpleAdapter adapter = new SimpleAdapter(this, data,R.layout.item_list, from, to);// 把Adapter放到ListView中显示listView.setAdapter(adapter);}
}

4.程序运行后的显示界面:

(三)创建BaseAdapter

实现BaseAdapter接口,能显示ArrayAdapter的效果,也能显示SimpleAdapter的效果。但是实现BaseAdapter要实现的方法比较多。

本示例显示一个明星的头像,然后在头像右边显示她的姓名和它的信息,并且添加一个条目点击事件和一个条目长按后移除对应信息的功能。

1.编辑main_activity.xml(和上面例子一样)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.lesson7_baseadapter.MainActivity" ><ListView
        android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/main_lv"/></RelativeLayout>

2.创建一个XML文件item_list.xml,并编辑

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:padding="5dp"android:layout_height="match_parent" ><ImageView
        android:id="@+id/item_iv"android:layout_width="60dp"android:layout_height="80dp"android:layout_centerVertical="true"android:scaleType="centerCrop"android:src="@drawable/ic_launcher" /><LinearLayout
        android:layout_width="match_parent"android:layout_height="match_parent"android:layout_toRightOf="@id/item_iv"android:orientation="vertical"android:padding="10dp" ><TextView
            android:id="@+id/item_tv_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="title" /><TextView
            android:id="@+id/item_tv_info"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:text="content" /></LinearLayout></RelativeLayout>

    布局文件说明:左边是一个图片,右边是一个线性布局,线性布局中上面是姓名文本,下面是信息文本.

3.java代码编写

(1)自定义一个类继承BaseAdapter

package com.example.lesson_homework_baseadapter;import java.util.HashMap;
import java.util.List;import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;/* * 自定义的BaseAdapter适配器* */
public class MyBaseAdapter extends BaseAdapter {//上下文,有上下文才能编辑视图Context context;//视图中显示的数据List<HashMap<String, Object>> list;// 通过构造方法传入上下文和list列表数据public MyBaseAdapter(Context context, List<HashMap<String, Object>> list) {this.context = context;this.list = list;}// 获取总共显示多少条数据的方法,返回的是List的长度,这个很必要,返多少ListView中就有多少条目@Overridepublic int getCount() {return list.size();}// 获取的是某一条目的具体内容@Overridepublic HashMap<String, Object> getItem(int position) {return list.get(position);}// 获取的对应条目的序列号@Overridepublic long getItemId(int position) {return position;}// 这个要重点理解// 获取的是对应条目的图形View@Override// position是对应的序列号,代表当前的第几项// converView对应的是布局重用,这个类似于缓冲功能// parent对应的是父类窗体,这个基本不用public View getView(int position, View convertView, ViewGroup parent) {// 一切如布局相关的都需要上下文,构造器中传入的上下文就是在这里用到的ViewHolder holder;// 对应条目第一次加载时if (convertView == null) {// 加载条目布局convertView = View.inflate(context, R.layout.item_list, null);// 第三个参数基本是null// 实例化holder对象,并把条目缓冲到holder中holder = new ViewHolder(convertView);// 在缓冲的View对象中添加holder标签convertView.setTag(holder);} else {// 页面第二次显示以前的条目时// 获取ViewHolder标签对象holder = (ViewHolder) convertView.getTag();}// 无论怎样holder中都会有ViewHolder标签对象中的数据// 把holder中对应的数据放出来holder.setData(list.get(position));return convertView;}// ViewHolder的使用,// 对于一个复杂的布局中组件比较多// 可以保存所有的布局上的组件// 这里每一个ViewHolder对应的是一个布局,一旦存在就不会重写创建,也是相当于缓冲的功能static class ViewHolder {TextView name;TextView info;ImageView iv;// 传入的是一个布局重用的View对象public ViewHolder(View convertView) {// 冲缓冲中提取数据iv = (ImageView) convertView.findViewById(R.id.item_iv);name = (TextView) convertView.findViewById(R.id.item_tv_name);info = (TextView) convertView.findViewById(R.id.item_tv_info);}// set方法,方便数据的显示,直接显示在屏幕中public void setData(HashMap<String, Object> hashMap) {iv.setImageResource(Integer.parseInt(hashMap.get("image").toString()));name.setText(hashMap.get("name").toString());info.setText(hashMap.get("info").toString());}}}

(2)主方法代码:

package com.example.lesson_homework_baseadapter;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListView;
import android.widget.Toast;public class MainActivity extends Activity {ListView lv;// 数据源// 图片1int[] images = { R.drawable.a1, R.drawable.a2, R.drawable.a3,R.drawable.a4, R.drawable.a5, R.drawable.a6, R.drawable.a7,R.drawable.a8, R.drawable.a9 };// 姓名String[] names = { "唐嫣", "杨幂", "赵丽颖", "王子文", "张佳宁", "江铠同", "杨紫", "唐艺昕","关晓彤" };// 文本内容String[] infos = {"1983年12月6日出生于上海。2006年毕业于中央戏剧学院表演系本科班。","1986年9月12日出生于北京市,中国内地影视女演员、流行乐歌手、影视制片人。","1987年10月16日出生于河北省廊坊市,中国内地影视女演员。2006年,因获得雅虎搜星比赛冯小刚组冠军而进入演艺圈;","1987年2月28日出生于四川成都,中国内地影视女演员、模特,毕业于中央戏剧学院。","1989年出生于吉林省辽源市,中国大陆女演员,2009年毕业于中央戏剧学院表演系本科。","1989年10月24日出生于山东省青岛市,毕业于中央戏剧学院,中国内地女演员。","1992年11月6日出生于北京市,2014年毕业于北京电影学院2010级表演系本科班。2002年,出演古装历史情感剧《孝庄秘史》开始崭露头角;","出生于四川省,现居住地重庆 ,中国内地女演员。2010年毕业于重庆大学美视电影学院表演系。2011年,唐艺昕参与郑晓龙导演执导的《后宫·甄嬛传》,开启了演艺生涯。 ","1997年9月17日出生于北京,学生、演员。2016年4月14日,北影艺考成绩出炉,关晓彤专业排名第一。" };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 实例化listView对象lv = (ListView) findViewById(R.id.main_lv);// 创建List存放数据final List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();// 给list对象保存数据for (int i = 0; i < names.length; i++) {HashMap<String, Object> map = new HashMap<String, Object>();map.put("name", names[i]);map.put("info", infos[i]);map.put("image", images[i]);list.add(map);}// 适配器的创建,这里要給适配器传递一个上下文和一个list的数据final MyBaseAdapter adapter = new MyBaseAdapter(this, list);// 把适配器添加到ListView中lv.setAdapter(adapter);// 为ListView设置监听事件setOnItemClickListenerlv.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {// 点击对应的条目后弹出一个对话框// position是对应的条目序列Toast.makeText(MainActivity.this,"选到" + list.get(position).get("name"),Toast.LENGTH_SHORT).show();}});// 一般长按事件用来删除信息行或显示更多的选择信息// 这里用长按来删除一行信息lv.setOnItemLongClickListener(new OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view,int position, long id) {// 从列表中删除相应条目list.remove(position);// 上面只是在集合里面删除,但是界面还是要做提醒后才能更新adapter.notifyDataSetChanged();// 消化事件,return true;}});}// 明星属性的类static class star {// 标题和内容属性String name;String info;int ivNum;// 设置构造方法,方便传递数据进来public star(String title, String content, int ivNum) {super();this.name = title;this.info = content;this.ivNum = ivNum;}}}

4.程序运行的结果:

点击事件的触发结果:

长按事件的触发结果:

其实上面的任意Adapter都有移除的功能,这里只是在BaseAdapter中展示一下。

上面就是Adapter的使用了。

总结一下:
我们发现上面的程序都是分三个步骤:
1.编写main_avtivity.xml文件
2.编写item_list.xml文件
3.编写java文件
其中第一个和第二个步骤都是比较简单的,第三个是我们要重点理解的。
特别是Adapter的创建。

    本文主要是介绍Adapter的使用搭配的是AdapterView中的ListView,关于更多AdapterView的使用在后面会更多的介绍。

最后回忆一下Adapter常用的实现类:
    1.ArrayAdapter:简单,易用的Adapter,可用于将数组或List集合多个值包装成多个列表项。
    2.SimpleAdapter:并不简单,功能强大的Adapter,可用于将List集合的多个对象包装成多个列表项
    3.SimpelCursor:与SimpleAdapter基本相似,只是用于包装Cursor提供的数据库查询集
    4.BaseAdapter(接口):通常用于被扩张。扩展BaseAdapter可以对个列表项进行最大限度的定制。

Android Adapter接口的实现类总结相关推荐

  1. UI组件之AdapterView及其子类关系,Adapter接口及其实现类关系

    AdapterView本身是一个抽象基类,它派生的的子类在用法上十分相似.AdapterView直接派生的三个子类:AbsListView,AbsSpinner,AdapterViewAnimator ...

  2. 2.5.2 Adapter接口及实现类

    Adapter常用实现类: 1.ArrayAdapter:简单,易用的Adapter,通用用于将数组或List集合的多个值包装成多个列表项 2.SimpleAdapter:并不简单,功能强大的Adap ...

  3. android adapter 组件,Android UI - AdapterView 及其子类

    AdapterView AdapterView 是一个抽象类,其派生的子类在用法上十分相似: AdapterView 继承了 ViewGroup: AdapterView 及其子类的继承关系如下: A ...

  4. android studio mvpplugin,MVPHelper Android Studio 插件,一键生成 MVP 代码接口以及实现类。 @codeKK Android开源站...

    一款适用于 Intellij IDEA 和 Android Studio 的插件, 可用于为 MVP 架构生成接口以及实现类, 解放双手. 欢迎 Issue Report, 欢迎 Feature Re ...

  5. Qt for Android 调用android原生接口分享图片或文字

    在用Qt开发android应用的时候,有一个需求是通过调用android原生接口去实现图片分享功能,原理很简单,首先在java文件中用android接口封装一个分享功能的方法,然后在C++中调用QAn ...

  6. android主板接口定义,范例解析:学习Android的IPC主板模式

    一.认识Android的IPC主板模式 系统架构设计最关键的任务就是组合(或称整合),而且最好是能与众不同.深具创新性组合.Android就擅用了主板模式,以通用性接口实践跨进程的IPC通信机制.由于 ...

  7. Adapter(适配器)--类对象结构型模式

    Adapter(适配器)–类对象结构型模式 一.意图 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本接口不兼容而不能一起工作的那些类可以一起工作. 二.动机 1.在软件系统中, ...

  8. 设计模式七:Adapter(适配器)——类对象结构型模式

    结构型模式: 结构型模式设计到如何组织类和对象以获得更大的结构. 结构型类模式: 采用继承机制来组合接口或实现.简单的例子是采用多重继承,这一模式尤其有助于多个独立开发的类库协同工作. 结构型对象模式 ...

  9. android中接口的作用是什么意思,详解Android接口Interface的使用和意义

    本文介绍是Android的一个重要的东西,接口Interface,详解两个方面: (1)Java是继承的,接口Interface是可以多个的,恰恰弥补了这个缺点. (2)回调,接口Interface里 ...

最新文章

  1. NA-NP-IE系列实验26: 基于链路的OSPF 简单口令认证
  2. Android Volley完全解析4:带你从源码的角度理解Volley
  3. Linux操作系统中内存buffer和cache的区别--从free命令说起(转)
  4. HttpRequest Java原生代码封装
  5. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)
  6. 机器学习week8 ex7 review
  7. 杭电1596find the safest road
  8. python 中基于 xlwings 处理 excel
  9. tomcat启动慢, Creation of SecureRandom instance for session ID generation using [SHA1PRNG]took [xx] mil
  10. Dell Optiplex主流台式机驱动安装指南
  11. java 泛型方法 类型_Java泛型方法
  12. 2的17次方java中表示什么,2的17次方(11的余数是多少)
  13. html怎么让滚动条不占位置,css怎么设置滚动条不占宽度?
  14. 第一章 | 加州房价数据集 | 端到端的机器学习 | 回归问题 | tensorflow2.6+sklearn | 学习笔记
  15. 人力资源总监面试时是怎么想的?
  16. linux用户管理(1)----创建用户(adduser和useradd)和删除用户(userdel)
  17. java 用PDFBox 删除 PDF文件中的一页 ,空白页啥的,此处删除最后一页为例 spring boot
  18. JavaWeb-狂神-P11
  19. Linux:shell编程(shell基本语法)
  20. 深度相机原理和优势对比

热门文章

  1. 【实战】恶搞图片生成器
  2. 圣斗士星矢243年前的圣战详细介绍
  3. 现代信息技术(IT)对会计模式的影响(by 杨烈飙)
  4. 高通Atheros所有WiFi芯片型号参数一览
  5. 如何利用AI(ChatGPT、NewBing、PHIND、YouChat)实现多智能体系统一致性仿真的代码编写
  6. python中str.center()的功能是什么_Python str内部功能介绍
  7. 市场主流性能测试工具简介
  8. 燕十八php笔记_燕十八ph视频教程笔记(PHP基础部分).doc
  9. 单片机检测信号通断通用电路(3.3V/5V直流信号,24V+直流信号,220V交流信号)
  10. 嵌入式linux矩阵键盘,基于嵌入式Linux的矩阵键盘驱动程序开发