Android中的Adapter
来源:互联网 发布:罗辑思维 人工智能 编辑:程序博客网 时间:2024/06/10 16:11
Android中的Adapter
Android完全遵循MVC设计模式,其Activity是Controller,Layout是View,Style、String等是Model。 而Layout形式太多,数据无法直接绑定到上面,因此Android就引用了Adapter这个机制作为复杂数据的展示转换载体,所以各种Adapter只不过是转换方式和能里不一眼而已。
Android中Adapter类图:
其中常用的实现类主要是:
1. BaseAdapter:通常用于被扩展。扩展BaseAdapter可以各列表项进行最大限制的定制。
2. ArrayAdapter:简单易用的Adapter,通常用于将数组或List集合的多个值包装成多个列表项。
3. SimpleAdapter:并不简单、功能强大的Adapter,可用于将List集合的多个对象包装成多个列表项。
4. SimpleCursorAdapter:与SimpleAdapter基本相似,只是用于包装Cursor提供的数据。
Adapter是将数据绑定到UI界面上的桥接类。 Adapter负责创建显示每个项目的子View和提供对下层数据的访问。在多数情况下,你不需要创建自己的Adapter。Android提供了一系列Adapter来将数据绑定到UI Widget上。
Adapter中的体系结构:
在Android开发中列表的使用是十分常见的。Google对列表的封装使列表既有显示传统文本列表的能力,也有加入了诸如选择项、复选项等处理事件的能力。
在Android的API中,List和Adapter都被放在了android.widget包内。包内的具体结构我这里先不展示了,主要侧重List和Adapter。Adapter的作用就是将要在列表内显示的数据和列表本身结合起来。列表本身只完成显示的作用,其实他就是继承自ViewGroup类,但是他又有一个独特的函数就是setAdapter()就是完成了View和Adapter的结合。Adapter如同其本身含义,其实就是一个适配器,他可以对要显示的数据进行统一的封装,主要是将数据变成View并提供给List。
从上面的类图大致可以知道: 顶层Adapter接口是其他Adapter的基类,在Adapter接口中主要有一下一些方法:
abstract int getCount();abstract Object getItem(int position);abstract long getItemId(int position);abstract int getItemViewType(int position);abstract View getView(int position,View convertVeiw,ViewGroup parent);
以上是比较重要的方法,ArrayAdapter他们也是重新实现以上方法的。在实际的开发过程中,往往我们要自己做属于自己的Adapter,以上方法都是需要重新实现的。
Adapter的使用:
不论是那种适配器模式,也不管是Listview也好还是gridview也好,对他们填充数据,都是分三步走。
1、创建一个数据填充的对象,可以是ListView, GridView, Gallery
如:ListView listView=(ListView) findViewById(R.id.listview_simple);
2、创建一个数据填充器,可以是BaseAdapter、SimpleAdapter,也可以是与数据库相关联的CursorAdapter。
直接使用系统封装的SimpleAdapter:
SimpleAdapter simpleAdapter = new SimpleAdapter(this, data, R.layout.simple_item, new String[] { "name", "info" }, new int[] { R.id.simple_name, R.id.simple_info});
重写系统的simpleadpter:
public class ListSimpleAdpter extends SimpleAdapter { private List<? extends Map<String, ?>> data = new ArrayList<>(); //要使用到的数据源 private int resource; //填充数据的资源文件,主要是布局文件即R.layout.xxx private String[] from; private Context context; public ListSimpleAdpter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) { super(context, data, resource, from, to); this.context = context; this.data = data; this.resource = resource; this.from = from; } @Override public int getCount() { //item的总行数 return data == null ? 0 : data.size(); } @Override public Object getItem(int position) { //item对象 return data.get(position); //这里返回的是一个Map或其子类的对象。具体对象还得用Map取 } @Override public long getItemId(int position) { //item的id return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { //绘制每一个item Holder holder = null; if (convertView == null) { //这里对于Adapter的优化,用的很古老的ViewHolder、ViewCache办法: convertView= LayoutInflater.from(context).inflate(resource, null); holder = new Holder(); holder.imageView=(ImageView) convertView.findViewById(R.id.listitem_pic); holder.title=(TextView) convertView.findViewById(R.id.listitem_title); holder.content=(TextView) convertView.findViewById(R.id.listitem_content); convertView.setTag(holder); } else { holder=(Holder) convertView.getTag(); } //向Item项中设置数据 /** * 按照执行逻辑,这里的这段代码会执行多次, 本来每个Item上的的数据只需要写到ListView的Item上一次 * 但这里,当position重新定位到原来已经写好数据的Item上时,又会重新执行下面这段代码,即重新向已经 * 写好数据的的Item上写数据。故在这里应该要做一些处理 */ holder.imageView.setImageResource(Integer.parseInt(data.get(position).get(from[0]).toString())); holder.title.setText(data.get(position).get(from[1]).toString()); holder.content.setText(data.get(position).get(from[2]).toString()); return convertView; } class Holder{ //假设每个Item项上都有一个ImageView、两个TextView。 ImageView imageView; TextView title; TextView content; }}
3、将数据填充到对象中去
listView.setAdapter(simpleAdapter);
其他的Adapter与这个Adapter的使用都差不多,就在描述了…..
- Android 中的 adapter
- Android 中的 adapter
- Android 中的 adapter
- android 中的 adapter介绍
- Android 中的 adapter
- Android中的Adapter用法
- Android中的各种Adapter
- 关于Android中的Adapter
- android listview中的adapter
- android中的Adapter使用
- Android 中的 Adapter 简介
- Android中的各种Adapter
- Android 中的Adapter
- Android中的Adapter详解
- Android中的Adapter
- Android中的adapter分析
- Android中的Adapter
- android中的adapter模式
- Hive优化---启用local模式
- Android系统架构
- codeforces 231B Magic, Wizardry and Wonders(超强技巧+思维+观察力)
- Java反射机制学习
- windows caffe 训练自己的数据
- Android中的Adapter
- JDBC Oracle和java的连接
- Hive优化--并行执行
- 用markdown写表格
- 笨办法学 Linux 4~7
- ajax、表单、重定向、textarea
- poj Muddy roads(贪心or递推)
- 分治策略之最大子数组问题
- O(n)回文子串(Manacher)算法