Android之Adapter用法总结-(转)
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用法总结-(转)相关推荐
- Android之Adapter用法总结
本文转自http://kb.cnblogs.com/a/2328334/,转载请注明原出处. Android之Adapter用法总结 作者:Devin Zhang 来源:博客园 发布时间:2012 ...
- Android的Adapter用法总结
Android之Adapter用法总结 1.Adapter概念 定义为将一个类的接口变换成客户端所期待的一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 在androi ...
- listview与adapter用法
Android listview与adapter用法 listview与adapter用法 博客分类: android 一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的 ...
- android图片显示组件,Android可循环显示图像的Android Gallery组件用法实例
本文实例分析了Android可循环显示图像的Android Gallery组件用法.分享给大家供大家参考,具体如下: Gallery组件主要用于横向显示图像列表,不过按常规做法.Gallery组件只能 ...
- Android webservice的用法详细讲解
Android webservice的用法详细讲解 看到有很多朋友对WebService还不是很了解,在此就详细的讲讲WebService,争取说得明白吧.此文章采用的项目是我毕业设计的webserv ...
- Android自定义Adapter的ListView的思路及代码
Android自定义Adapter的ListView的思路及代码,需要的朋友可以参考一下 width="650" height="200" align=&quo ...
- android中Adapter适配器的讲解
android中Adapter适配器的讲解 Adapter(适配器的讲解) 适配器就我自己来看,我觉得这是一个非常重要的知识点,Adapter是用来帮助填出数据的中间桥梁,简单点说吧:将各种数据以合适 ...
- android room表关联,Android Room的用法
Android Room的用法 SQLite是Android内置的轻量级关系型数据库,但直接使用SQLite core包做数据库操作有以下劣势:需要编写长且重复的代码,这会很耗时且容易出错. 管理SQ ...
- Android RxJava 基本用法
Android RxJava 基本用法 RxJava 使用函数响应式编程方式,它可以简化项目,处理嵌套回调的异步事件. RxJava 依赖 这里以 RxJava 2.2.1 为例.在 build.gr ...
- Android中富文本用法包括点击事件处理
Android中富文本用法包括点击事件处理 关于 只需要富文本展示效果,不需要点击事件 展示富文本加点击事件 关于 最近项目需要中需要用到富文本展示及富文本点击功能,先去百度了一下,大多数的说法是 ...
最新文章
- 三维目标检测算法原理
- mysql关系模式怎么画_关系数据库与mysql
- ab plc软件_【原创】AB上位机FactoryTalk View的使用教程(上)
- java上帝模块常见的情况_JVM上帝视角看JVM内存模型,分而治之论各模块详情详解...
- Family.Show:一个很好玩的东东
- 2019最新蚂蚁金服Java 4面真题
- linux 下 pip 安装教程6,在CentOS下安装pip
- 操作系统学习笔记:内存管理
- 钽电容封装大全及技术参数
- SQL常用脚本大全,建议收藏!
- 设置outlook开机自动启动
- 《游牧者的抉择》读书笔记
- 自定义设置HTTP响应头
- Maven 中的cannot Resolve情况
- 城市夜景照明对于安科瑞智能照明系统的运用
- 今日头条的推荐阅读你为什么都喜欢?
- Visual Studio界面颜色更换 及 Visual Assist X助手使用
- oracle怎么新开账期,oracle成本核算
- c语言实现动态二维数组
- Python入门到精通【精品】第一章 - Python概述
热门文章
- Django python session配置和用法
- android不是16位,16位图像和Android处理
- vue—点击换一批就更换一批内容_Vue.js点击切换按钮改变内容的实例讲解
- php向mysql提交数据_PHP 如何向 MySQL 发送数据
- 什么将计算机连接到网络,Windows 8.1官方教程:将电脑连接到网络-windows技巧-电脑技巧收藏家...
- java 边界_Java泛型中的上下边界的理解
- datatable自定义表单或者导出excel按钮,搜索
- hibernate 基础方法(二)【相关配置详解】
- 聊聊我的 2018 年
- linxu 获取指定字符的前后多少行