Android之Adapter用法总结

1.概念

Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(List View,Grid View)等地方都需要用到Adapter。如下图直观的表达了Data、Adapter、View三者的关系:

Android中所有的Adapter一览:

由图可以看到在Android中与Adapter有关的所有接口、类的完整层级图。在我们使用过程中可以根据自己的需求实现接口或者继承类进行一定的扩展。比较常用的有 Base Adapter,Impleader,Adapter,Counteradaptation等。

  • BaseAdapter是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
  • ArrayAdapter支持泛型操作,最为简单,只能展示一行字。
  • SimpleAdapter有最好的扩充性,可以自定义出各种效果。
  • SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。如需要实现更复杂的UI也可以重写其他方法。可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。

2.应用案例

1)ArrayAdapter

列表的显示需要三个元素:

a.ListVeiw 用来展示列表的View。

b.适配器 用来把数据映射到ListView上的中介。

c.数据    具体的将被映射的字符串,图片,或者基本组件。

案例一

public class ArrayAdapterActivity extends ListActivity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//列表项的数据String[] strs = {"1","2","3","4","5"};ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,strs);setListAdapter(adapter);}}

案例二

    public class MyListView extends Activity {private ListView listView;//private List<String> data = new ArrayList<String>();@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);listView = new ListView(this);listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));setContentView(listView);}private List<String> getData(){List<String> data = new ArrayList<String>();data.add("测试数据1");data.add("测试数据2");data.add("测试数据3");data.add("测试数据4");return data;}}

上面代码使用了Adapter(Context context, int resourcefulness, List<T> objects)来装配数据,要装配这些数据就需要一个连接List View视图对象和数组数据的适配器来两者的适配工作,Adapter的构造需要三个参数,依次为this,布局文件(注意这里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字,数据源(一个List集合)。同时用adapter()完成适配的最后工作。效果图如下:

2)SimpleAdapter   simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,ListActivity和普通的Activity没有太大的差别,不同就是对显示ListView做了许多优化,方面显示而已。

案例一

simple.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
/>
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:textSize="20sp"
/>
</LinearLayout>

public class SimpleAdapterActivity extends ListActivity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.simple, new String[] { "title",  "img" }, new int[] { R.id.title, R.id.img });setListAdapter(adapter);}private List<Map<String, Object>> getData() {//map.put(参数名字,参数值)List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();Map<String, Object> map = new HashMap<String, Object>();map.put("title", "摩托罗拉");map.put("img", R.drawable.icon);list.add(map);map = new HashMap<String, Object>();map.put("title", "诺基亚");map.put("img", R.drawable.icon);list.add(map);map = new HashMap<String, Object>();map.put("title", "三星");map.put("img", R.drawable.icon);list.add(map);return list;}  }

案例二   下面的程序是实现一个带有图片的类表。首先需要定义好一个用来显示每一个列内容的xml,vlist.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent"android:layout_height="fill_parent">   <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5px"/><LinearLayout android:orientation="vertical"  android:layout_width="wrap_content"  android:layout_height="wrap_content"><TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content"android:textColor="#FFFFFFFF" android:textSize="22px" /><TextView android:id="@+id/info"  android:layout_width="wrap_content" android:layout_height="wrap_content"android:textColor="#FFFFFFFF" android:textSize="13px" /></LinearLayout></LinearLayout>

public class MyListView3 extends ListActivity {// private List<String> data = new ArrayList<String>();@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.vlist,new String[]{"title","info","img"},new int[]{R.id.title,R.id.info,R.id.img});setListAdapter(adapter);}private List<Map<String, Object>> getData() {List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();Map<String, Object> map = new HashMap<String, Object>();map.put("title", "G1");map.put("info", "google 1");map.put("img", R.drawable.i1);list.add(map);map = new HashMap<String, Object>();map.put("title", "G2");map.put("info", "google 2");map.put("img", R.drawable.i2);list.add(map);map = new HashMap<String, Object>();map.put("title", "G3");map.put("info", "google 3");map.put("img", R.drawable.i3);list.add(map);return list;}}

  使用Impleader的数据用一般都是Hash Map构成的List,list的每一节对应Listie的每一行。Hash Map的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局alist.XML。下面做适配,new一个Impleader参数一次是:this,布局文件(alist.XML),Hash Map的 title 和 info,IgM。布局文件的组件id,title,info,IgM。布局文件的各组件分别映射到Hash Map的各元素上,完成适配。

运行效果如下图:

3)SimpleCursorAdapter

public class SimpleCursorAdapterActivity extends ListActivity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//获得一个指向系统通讯录数据库的Cursor对象获得数据来源Cursor cur = getContentResolver().query(People.CONTENT_URI, null, null, null, null);startManagingCursor(cur);//实例化列表适配器ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cur, new String[] {People.NAME}, new int[] {android.R.id.text1});setListAdapter(adapter);}}

一定要以数据库作为数据源的时候,才能使用SimpleCursorAdapter,这里特别需要注意的一点是:不要忘了在AndroidManifest.xml文件中加入权限

<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

效果如下:

4)BaseAdapter

  有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮。添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上。但是事实并非这样,因为按钮是无法映射的,即使你成功的用布局文件显示出了按钮也无法添加按钮的响应,这时就要研究一下ListView是如何现实的了,而且必须要重写一个类继承BaseAdapter。下面的示例将显示一个按钮和一个图片,两行字如果单击按钮将删除此按钮的所在行。并告诉你ListView究竟是如何工作的。

vlist2.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent"android:layout_height="fill_parent"><ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5px"/><LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"><TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content"android:textColor="#FFFFFFFF" android:textSize="22px" /><TextView android:id="@+id/info" android:layout_width="wrap_content" android:layout_height="wrap_content"android:textColor="#FFFFFFFF" android:textSize="13px" /></LinearLayout><Button android:id="@+id/view_btn" android:layout_width="wrap_content"  android:layout_height="wrap_content"android:text="@string/s_view_btn" android:layout_gravity="bottom|right" /></LinearLayout>

/**
002     * @author
003     *
004     */
005    public class MyListView4 extends ListActivity {
006
007
008        private List<Map<String, Object>> mData;
009
010        @Override
011        public void onCreate(Bundle savedInstanceState) {
012            super.onCreate(savedInstanceState);
013            mData = getData();
014            MyAdapter adapter = new MyAdapter(this);
015            setListAdapter(adapter);
016        }
017
018        private List<Map<String, Object>> getData() {
019            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
020
021            Map<String, Object> map = new HashMap<String, Object>();
022            map.put("title", "G1");
023            map.put("info", "google 1");
024            map.put("img", R.drawable.i1);
025            list.add(map);
026
027            map = new HashMap<String, Object>();
028            map.put("title", "G2");
029            map.put("info", "google 2");
030            map.put("img", R.drawable.i2);
031            list.add(map);
032
033            map = new HashMap<String, Object>();
034            map.put("title", "G3");
035            map.put("info", "google 3");
036            map.put("img", R.drawable.i3);
037            list.add(map);
038
039            return list;
040        }
041
042        // ListView 中某项被选中后的逻辑
043        @Override
044        protected void onListItemClick(ListView l, View v, int position, long id) {
045
046            Log.v("MyListView4-click", (String)mData.get(position).get("title"));
047        }
048
049        /**
050         * listview中点击按键弹出对话框
051         */
052        public void showInfo(){
053            new AlertDialog.Builder(this)
054            .setTitle("我的listview")
055            .setMessage("介绍...")
056            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
057                @Override
058                public void onClick(DialogInterface dialog, int which) {
059                }
060            })
061            .show();
062
063        }
064         /** 当Listie有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候   就需要按需填充并重新使用view来减少对象的创建
065          *最快的方式是定义一个Pewholder,将convex的tag设置为Pewholder,不为空时重新使用即可
066          */
067        public final class ViewHolder{
068            public ImageView img;
069            public TextView title;
070            public TextView info;
071            public Button viewBtn;
072        }
073
074
075        public class MyAdapter extends BaseAdapter{
076
077            private LayoutInflater mInflater;
078
079
080            public MyAdapter(Context context){
081                this.mInflater = LayoutInflater.from(context);
082            }
083            @Override
084            public int getCount() {
085                // TODO Auto-generated method stub
086                return mData.size();
087            }
088
089            @Override
090            public Object getItem(int arg0) {
091                // TODO Auto-generated method stub
092                return null;
093            }
094
095            @Override
096            public long getItemId(int arg0) {
097                // TODO Auto-generated method stub
098                return 0;
099            }
100
101            @Override
102            public View getView(int position, View convertView, ViewGroup parent) {
103
104                ViewHolder holder = null;
105                if (convertView == null) {
106
107                    holder=new ViewHolder();
108
109                    convertView = mInflater.inflate(R.layout.vlist2, null);
110                    holder.img = (ImageView)convertView.findViewById(R.id.img);
111                    holder.title = (TextView)convertView.findViewById(R.id.title);
112                    holder.info = (TextView)convertView.findViewById(R.id.info);
113                    holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
114                    convertView.setTag(holder);
115
116                }else {
117
118                    holder = (ViewHolder)convertView.getTag();
119                }
120
121
122                holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));
123                holder.title.setText((String)mData.get(position).get("title"));
124                holder.info.setText((String)mData.get(position).get("info"));
125
126                holder.viewBtn.setOnClickListener(new View.OnClickListener() {
127
128                    @Override
129                    public void onClick(View v) {
130                        showInfo();
131                    }
132                });
133
134
135                return convertView;
136            }
137
138        }
139    }

  

下面将对上述代码,做详细的解释,listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度,然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。

  系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的vlist2.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那再绘制下一行,直到绘完为止。在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了。

效果如下:

转自:http://blog.csdn.net/fznpcy/article/details/8658155

转载于:https://www.cnblogs.com/YangBinChina/p/4099063.html

Android之Adapter用法总结-(转)相关推荐

  1. Android之Adapter用法总结

    本文转自http://kb.cnblogs.com/a/2328334/,转载请注明原出处. Android之Adapter用法总结 作者:Devin Zhang  来源:博客园  发布时间:2012 ...

  2. Android的Adapter用法总结

    Android之Adapter用法总结 1.Adapter概念   定义为将一个类的接口变换成客户端所期待的一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作.   在androi ...

  3. listview与adapter用法

    Android listview与adapter用法 listview与adapter用法 博客分类: android 一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的 ...

  4. android图片显示组件,Android可循环显示图像的Android Gallery组件用法实例

    本文实例分析了Android可循环显示图像的Android Gallery组件用法.分享给大家供大家参考,具体如下: Gallery组件主要用于横向显示图像列表,不过按常规做法.Gallery组件只能 ...

  5. Android webservice的用法详细讲解

    Android webservice的用法详细讲解 看到有很多朋友对WebService还不是很了解,在此就详细的讲讲WebService,争取说得明白吧.此文章采用的项目是我毕业设计的webserv ...

  6. Android自定义Adapter的ListView的思路及代码

    Android自定义Adapter的ListView的思路及代码,需要的朋友可以参考一下 width="650" height="200" align=&quo ...

  7. android中Adapter适配器的讲解

    android中Adapter适配器的讲解 Adapter(适配器的讲解) 适配器就我自己来看,我觉得这是一个非常重要的知识点,Adapter是用来帮助填出数据的中间桥梁,简单点说吧:将各种数据以合适 ...

  8. android room表关联,Android Room的用法

    Android Room的用法 SQLite是Android内置的轻量级关系型数据库,但直接使用SQLite core包做数据库操作有以下劣势:需要编写长且重复的代码,这会很耗时且容易出错. 管理SQ ...

  9. Android RxJava 基本用法

    Android RxJava 基本用法 RxJava 使用函数响应式编程方式,它可以简化项目,处理嵌套回调的异步事件. RxJava 依赖 这里以 RxJava 2.2.1 为例.在 build.gr ...

  10. Android中富文本用法包括点击事件处理

    Android中富文本用法包括点击事件处理 关于 只需要富文本展示效果,不需要点击事件 展示富文本加点击事件 关于   最近项目需要中需要用到富文本展示及富文本点击功能,先去百度了一下,大多数的说法是 ...

最新文章

  1. 三维目标检测算法原理
  2. mysql关系模式怎么画_关系数据库与mysql
  3. ab plc软件_【原创】AB上位机FactoryTalk View的使用教程(上)
  4. java上帝模块常见的情况_JVM上帝视角看JVM内存模型,分而治之论各模块详情详解...
  5. Family.Show:一个很好玩的东东
  6. 2019最新蚂蚁金服Java 4面真题
  7. linux 下 pip 安装教程6,在CentOS下安装pip
  8. 操作系统学习笔记:内存管理
  9. 钽电容封装大全及技术参数
  10. SQL常用脚本大全,建议收藏!
  11. 设置outlook开机自动启动
  12. 《游牧者的抉择》读书笔记
  13. 自定义设置HTTP响应头
  14. Maven 中的cannot Resolve情况
  15. 城市夜景照明对于安科瑞智能照明系统的运用
  16. 今日头条的推荐阅读你为什么都喜欢?
  17. Visual Studio界面颜色更换 及 Visual Assist X助手使用
  18. oracle怎么新开账期,oracle成本核算
  19. c语言实现动态二维数组
  20. Python入门到精通【精品】第一章 - Python概述

热门文章

  1. Django python session配置和用法
  2. android不是16位,16位图像和Android处理
  3. vue—点击换一批就更换一批内容_Vue.js点击切换按钮改变内容的实例讲解
  4. php向mysql提交数据_PHP 如何向 MySQL 发送数据
  5. 什么将计算机连接到网络,Windows 8.1官方教程:将电脑连接到网络-windows技巧-电脑技巧收藏家...
  6. java 边界_Java泛型中的上下边界的理解
  7. datatable自定义表单或者导出excel按钮,搜索
  8. hibernate 基础方法(二)【相关配置详解】
  9. 聊聊我的 2018 年
  10. linxu 获取指定字符的前后多少行