- 浏览: 238453 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
xchd:
分别在什么时候(情况下)用ThreadFactory、Exec ...
Executor线程池实例 -
mikey_5:
是不是没有写完啊
Executor线程池实例 -
xinyao:
楼主,你好,请问能给我发个源码吗,我要在一个页面能实时看到下载 ...
Android学习系列(19)--App离线下载 -
sdtzkj:
...
jasperReport 帮助文档 api -
shero_ys:
public class VrowsePicActivity ...
android handler 实现三步曲
Adapter是将数据绑定到UI界面上的桥接类。Adapter负责创建显示每个项目的子View和提供对下层数据的访问。
支持Adapter绑定的UI控件必须扩展AdapterView抽象类。创建自己的继承自AdapterView的控件和创建新的Adapter类来绑定它们是可能的。
一些Android提供的Adapter介绍
在多数情况下,你不需要白手创建自己的Adapter。Android提供了一系列Adapter来将数据绑定到UI Widget上。
因为Android负责提供数据和选择用于显示每个项目的View,所以Adapter能快速地修改要绑定的控件的外观和功能。下面的列表显示了两个最有用和最通用的本地Adapter:
❑ ArrayAdapter
ArrayAdapter是一个绑定View到一组对象的通用类。默认情况下,ArrayAdapter绑定每个对象的toString值到在layout中预先定义的TextView控件上。可变通的,构造函数允许你使用更加复杂的layout或者通过重写getView方法来扩展类从而使用TextView的替代物(如ImageView或嵌套的layout)。
❑ SimpleCursorAdapter
SimpleCursorAdapter绑定View到Content Provider查询返回的游标上。指定一个XML layout定义,然后将数据集中的每一列的值绑定到layout中的一个View上。
接下来的章节将深入挖掘这些Adapter类的细节。例子中,提供了绑定数据到ListView上,尽管这个逻辑会和其他一些AdapterView类(如Spinner和Gallery)工作的一样。
使用Adapter进行数据绑定
将Adapter应用到继承自AdapterView类上,你需要调用View的setAdapter方法,传入一个Adapter实例,如下面的片段所示:
ArrayList<String> myStringArray = new ArrayList<String>();
ArrayAdapter<String> myAdapterInstance;
int layoutID = android.R.layout.simple_list_item_1;
myAdapterInstance = new ArrayAdapter<String>(this, layoutID, myStringArray);
myListView.setAdapter(myAdapterInstance);
这个片段显示了最简单的情况,将数组中的字符串绑定到ListView中用于显示每个项目的简单TextView控件上。
接下来的第一个例子显示了如何绑定一组复杂的对象到ListView上,使用一个自定义的layout。第二个例子显示了如何使用SimpleCursorAdapter来绑定查询结果到ListView中的自定义layout上。
在android开发中列表的使用是十分常见的。google对列表的封装使列表既有显示传统文本列表的能力,也有加入了诸如选择项、复选项等处理事件的能力。这里写一些我这几天对这个问题的理解。
在android的api中,LIST和adapter都被放在了android.widget包内。包内的具体结构我这里先不展示了,主要侧重列表和adapter。adapter的作用就是将要在列表内显示的数据和列表本身结合起来。列表本身只完成显示的作用,其实他就是继承自VIEWGROUP类。但是他又有一个独特的函数就是setAdapter()就是完成了view和adapter的结合。adapter如同其本身含义,其实就是一个适配器,他可以对要显示的数据进行统一的封装,主要是将数据变成view提供给list。
我们先来看看adapter的体系:
public interface Adapter----0层(表示继承体系中的层次)
public interface ExpandableListAdapter---(无所谓层次因为没有其他接口继承实现它)
这是adapter的始祖,其他个性化的adapter均实现它并加入自己的接口。
public interface ListAdapter----1层
public interface SpinnerAdapter----1层
public interface WrapperListAdapter----2层(实现ListAdapter)
以上接口层面上的体系已经完了。可以看出来作为widget view的桥梁adapter其实只分为2种:ListAdapter和SpinnerAdapter以及ExpandableListAdapter。也就是说所有widget也就是基于list和spinne与ExpandableList三种view形式的。
由于在实际使用时,我们需要将数据加入到Adapter,而以接口形式呈现的adapter无法保存数据,于是Adapter就转型为类的模式。
public abstract class BaseAdapter----2层(实现了ListAdapter和SpinnerAdapter)
以抽象类的形式出现构造了类型态下的顶层抽象,包容了List和Spinner
public class ArrayAdapter----3层
public class SimpleAdapter---3层
public class CursorAdapter----3层(CursorAdapter其后还有子类这里先不探讨)
基本体系有了之后,让我们看看顶层Adapter里有哪些方法(只列举常用的):
abstract Object getItem(int position)
abstract int getCount()
abstract long getItemId(int position)
abstract int getItemViewType(int position)
abstract View getView(int position,View convertVeiw,ViewGroup parent)
以上是比较重要的方法,ArrayAdapter他们也是重新实现以上方法的。在实际的开发过程中,往往我们要自己做属于自己的Adapter,以上方法都是需要重新实现的。
ArrayAdapter和SimpleCursorAdapter例子
使用ArrayAdapter定制To-Do List
这个例子将扩展To-Do List工程,以一个ToDoItem对象来储存每一个项目,包含每个项目的创建日期。
你将扩展ArrayAdapter类来绑定一组ToDoItem对象到ListView上,并定制用于显示每一个ListView项目的layout。
1. 返回到To-Do List工程。创建一个新的ToDoItem类来保存任务和任务的创建日期。重写toString方法来返回一个项目数据的概要。
package com.paad.todolist; import java.text.SimpleDateFormat; import java.util.Date; public class ToDoItem { String task; Date created; public String getTask() { return task; } public Date getCreated() { return created; } public ToDoItem(String _task) { this(_task, new Date(java.lang.System.currentTimeMillis())); } public ToDoItem(String _task, Date _created) { task = _task; created = _created; } @Override public String toString() { SimpleDateFormat sdf = new SimpleDateFormat(“dd/MM/yy”); String dateString = sdf.format(created); return “(“ + dateString + “) “ + task; } }
2. 打开ToDoList Activity,修改ArrayList和ArrayAdapter变量的类型,储存ToDoItem对象而不是字符串。然后,你将修改onCreate方法来更新相应的变量初始化。你还需要更新onKeyListener处理函数来支持ToDoItem对象。
- private ArrayList<ToDoItem> todoItems;
- private ListView myListView;
- private EditText myEditText;
- private ArrayAdapter<ToDoItem> aa;
- @Override public void onCreate(Bundle icicle) {
- super.onCreate(icicle); // Inflate your view setContentView(R.layout.main); //
- Get references to UI widgets myListView = (ListView)findViewById(R.id.myListView);
- myEditText = (EditText)findViewById(R.id.myEditText);
- todoItems = new ArrayList<ToDoItem>();
- int resID = R.layout.todolist_item; aa = new ArrayAdapter<ToDoItem>(this, resID, todoItems);
- myListView.setAdapter(aa);
- myEditText.setOnKeyListener(new OnKeyListener() {
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- if (event.getAction() == KeyEvent.ACTION_DOWN)
- if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
- ToDoItem newItem; newItem = new ToDoItem(myEditText.getText().toString()); todoItems.add(0, newItem);
- myEditText.setText(“”);
- aa.notifyDataSetChanged(); cancelAdd(); return true;
- }
- return false;
- }
- });
- registerForContextMenu(myListView);
- }
3. 如果你运行Activity,它将显示每个to-do项目,如图5-3所示。
图5-3
4. 现在,你可以创建一个自定义的layout来显示每一个to-do项目。修改在第4章中创建的自定义layout,包含另外一个TextView,它将用于显示每个to-do项目的创建日期。
- import java.text.SimpleDateFormat;
- import android.content.Context;
- import java.util.*;
- import android.view.*;
- import android.widget.*;
- public class ToDoItemAdapter extends ArrayAdapter<ToDoItem> { int resource; public ToDoItemAdapter(Context _context,int _resource, List<ToDoItem> _items) {
- super(_context, _resource, _items); resource = _resource;
- }
- @Override public View getView(int position, View convertView, ViewGroup parent) {
- LinearLayout todoView; ToDoItem item = getItem(position);
- String taskString = item.getTask();
- Date createdDate = item.getCreated();
- SimpleDateFormat sdf = new SimpleDateFormat(“dd/MM/yy”);
- String dateString = sdf.format(createdDate); if (convertView == null) { todoView = new LinearLayout(getContext());
- String inflater = Context.LAYOUT_INFLATER_SERVICE;
- LayoutInflater vi; vi = (LayoutInflater)getContext().getSystemService(inflater); vi.inflate(resource, todoView, true);
- }
- else {
- todoView = (LinearLayout) convertView;
- }
- TextView dateView = (TextView)todoView.findViewById (R.id.rowDate);
- TextView taskView = (TextView)todoView.findViewById(R.id.row); dateView.setText(dateString);
- taskView.setText(taskString);
- return todoView;
- }
- }
import java.text.SimpleDateFormat; import android.content.Context; import java.util.*; import android.view.*; import android.widget.*; public class ToDoItemAdapter extends ArrayAdapter<ToDoItem> { int resource; public ToDoItemAdapter(Context _context,int _resource, List<ToDoItem> _items) { super(_context, _resource, _items); resource = _resource; } @Override public View getView(int position, View convertView, ViewGroup parent) { LinearLayout todoView; ToDoItem item = getItem(position); String taskString = item.getTask(); Date createdDate = item.getCreated(); SimpleDateFormat sdf = new SimpleDateFormat(“dd/MM/yy”); String dateString = sdf.format(createdDate); if (convertView == null) { todoView = new LinearLayout(getContext()); String inflater = Context.LAYOUT_INFLATER_SERVICE; LayoutInflater vi; vi = (LayoutInflater)getContext().getSystemService(inflater); vi.inflate(resource, todoView, true); } else { todoView = (LinearLayout) convertView; } TextView dateView = (TextView)todoView.findViewById (R.id.rowDate); TextView taskView = (TextView)todoView.findViewById(R.id.row); dateView.setText(dateString); taskView.setText(taskString); return todoView; } }
5. 创建一个新的类(ToDoItemAdapter),使用指定的ToDoItem变量来扩展一个ArrayAdapter。重写getView方法来将ToDoItem对象中的task和date属性指定给第4步创建的layout中的View。
- import java.text.SimpleDateFormat;
- import android.content.Context;
- import java.util.*;
- import android.view.*;
- import android.widget.*;
- public class ToDoItemAdapter extends ArrayAdapter<ToDoItem> { int resource; public ToDoItemAdapter(Context _context,int _resource, List<ToDoItem> _items) {
- super(_context, _resource, _items); resource = _resource;
- }
- @Override public View getView(int position, View convertView, ViewGroup parent) {
- LinearLayout todoView; ToDoItem item = getItem(position);
- String taskString = item.getTask();
- Date createdDate = item.getCreated();
- SimpleDateFormat sdf = new SimpleDateFormat(“dd/MM/yy”);
- String dateString = sdf.format(createdDate); if (convertView == null) { todoView = new LinearLayout(getContext());
- String inflater = Context.LAYOUT_INFLATER_SERVICE;
- LayoutInflater vi; vi = (LayoutInflater)getContext().getSystemService(inflater); vi.inflate(resource, todoView, true);
- }
- else {
- todoView = (LinearLayout) convertView;
- }
- TextView dateView = (TextView)todoView.findViewById (R.id.rowDate);
- TextView taskView = (TextView)todoView.findViewById(R.id.row); dateView.setText(dateString);
- taskView.setText(taskString);
- return todoView;
- }
- }
import java.text.SimpleDateFormat; import android.content.Context; import java.util.*; import android.view.*; import android.widget.*; public class ToDoItemAdapter extends ArrayAdapter<ToDoItem> { int resource; public ToDoItemAdapter(Context _context,int _resource, List<ToDoItem> _items) { super(_context, _resource, _items); resource = _resource; } @Override public View getView(int position, View convertView, ViewGroup parent) { LinearLayout todoView; ToDoItem item = getItem(position); String taskString = item.getTask(); Date createdDate = item.getCreated(); SimpleDateFormat sdf = new SimpleDateFormat(“dd/MM/yy”); String dateString = sdf.format(createdDate); if (convertView == null) { todoView = new LinearLayout(getContext()); String inflater = Context.LAYOUT_INFLATER_SERVICE; LayoutInflater vi; vi = (LayoutInflater)getContext().getSystemService(inflater); vi.inflate(resource, todoView, true); } else { todoView = (LinearLayout) convertView; } TextView dateView = (TextView)todoView.findViewById (R.id.rowDate); TextView taskView = (TextView)todoView.findViewById(R.id.row); dateView.setText(dateString); taskView.setText(taskString); return todoView; } }
6. 最后,用ToDoItemAdapter替换ArrayAdapter的定义。
private ToDoItemAdapter aa;
在onCreate中,使用new ToDoItemAdapter来替换ArrayAdapter<String>的实例化。
aa = new ToDoItemAdapter(this, resID, todoItems);
7. 如果你运行Activity,它看起来如图5-4的截图。
图5-4
使用SimpleCursorAdapter
SimpleCursorAdapter允许你绑定一个游标的列到ListView上,并使用自定义的layout显示每个项目。
SimpleCursorAdapter的创建,需要传入当前的上下文、一个layout资源,一个游标和两个数组:一个包含使用的列的名字,另一个(相同大小)数组包含View中的资源ID,用于显示相应列的数据值。
下面的框架代码显示了如何构造一个SimpleCursorAdapter来显示联系人信息:
- String uriString = “content://contacts/people/”;
- Cursor myCursor = managedQuery(Uri.parse(uriString), null, null, null, null);
- String[] fromColumns = new String[] {
- People.NUMBER,
- eople.NAME
- };
- int[] toLayoutIDs = new int[] {
- R.id.nameTextView,
- R.id.numberTextView
- };
- SimpleCursorAdapter myAdapter; myAdapter = new SimpleCursorAdapter(this,R.layout.simplecursorlayout,myCursor,fromColumns,toLayoutIDs)
String uriString = “content://contacts/people/”; Cursor myCursor = managedQuery(Uri.parse(uriString), null, null, null, null); String[] fromColumns = new String[] { People.NUMBER, eople.NAME }; int[] toLayoutIDs = new int[] { R.id.nameTextView, R.id.numberTextView }; SimpleCursorAdapter myAdapter; myAdapter = new SimpleCursorAdapter(this,R.layout.simplecursorlayout,myCursor,fromColumns,toLayoutIDs)
SimpleCursorAdapter在本章前面的创建选择联系人的例子中使用过。你将在第6章学习到更多关于Content Provider和Cursor的内容,那里你也将找到更多SimpleCursorAdapter的例子。
发表评论
-
Android学习系列(19)--App离线下载
2011-08-13 11:40 1403Android学习系列(19)--App离线下载 ... -
Android学习系列(20)-App数据格式之解析Json
2011-08-13 11:28 1603JSON数据格式,在Android中被广泛运用于客户端和网络( ... -
Android学习系列(1)--为App签名(为apk签名)
2011-08-13 11:20 1683写博客是一种快乐,前提是你有所写,与人分享,是另一种快乐, ... -
Android学习系列(4)--App自适应draw9patch不失真背景
2011-08-13 11:16 2211做人要大度,海纳百川,做事要圆滑,左右逢源,这让我想到了编程也 ... -
Android自定义View之一:初探实例 .
2011-08-13 11:09 1485Android自定义View实现很简单 继承View,重写构 ... -
Android多媒体学:播放网络上的视频 .
2011-08-13 11:05 2068Android支持播放网络上的视频。在播放网络上的视频时,牵涉 ... -
Android多媒体学:利用AudioRecord类实现自己的音频录制程序 .
2011-08-13 11:02 5876AudioRecord类相对于MediaRecorder来说, ... -
Android多媒体:实现图像的编辑和合成 .
2011-08-13 10:59 2165package demo.camera; import ja ... -
自动完成框
2011-05-03 13:44 742请下载源码 -
读取sd卡照片
2011-05-03 13:43 1306请下载源码 -
UC菜单栏布局
2011-05-03 13:41 1125请下载附件 -
Executor线程池实例
2011-04-06 17:42 6679Executor 是 java5 下的一个 ... -
android handler 实现三步曲
2011-04-06 16:59 1435一. 要实现接口: public class VrowseP ... -
android 横竖屏切换
2011-03-25 14:33 1934①不理会。。②只竖屏 ... -
android 分辨率调试
2011-03-25 13:36 1868一:不同的layout Android ... -
android 图片内存溢出
2011-03-21 18:24 3087我的代码如下 is = new FileI ... -
android Exid 不可修改
2011-03-21 13:47 1260Android:只读EditText内容可滚动(禁止输入法)的 ... -
android 对话提示框大全
2011-03-21 12:34 3191Android 对话框(Dialog)大全 建立你自己的对话框 ... -
Android消息提示框和对话框
2011-03-21 12:29 1363在某些情况下需要向用户弹出提示消息,如显示错误信息,收到短消息 ... -
android tab 用法
2011-03-11 15:10 1752TabHost广泛运用于android程序中,在程序中运用Ta ...
相关推荐
在Android开发中,Adapter是一个非常重要的组件,它起到了数据与视图之间的桥梁作用。Adapter类允许我们将数据集合(如数组或列表)绑定到UI组件,如ListView、GridView或Spinner等。在Android中,我们通常会遇到三...
**Adapter** 是 Android 开发中连接后端数据和前端视图的一个关键组件。它作为数据和用户界面(UI)之间的桥梁,在Android开发中扮演着极其重要的角色。尤其是在常见的视图组件如 `ListView`, `GridView` 等地方,...
本篇将详细讲解如何实现Adapter中的子控件与Activity之间的通信,以提高用户体验并实现更复杂的交互功能。 首先,我们需要了解Adapter的基本工作原理。Adapter是一个接口,它为不同的视图提供数据,并负责将数据...
4. **getView()方法**:Adapter中最关键的方法是`getView()`,它负责为ListView的每一个Item创建View。ListView在滚动时,会复用Item的View,只有当Item实际可见时,才会调用`getView()`方法生成或更新View的内容。...
在Android开发中,Adapter是连接数据源和UI组件的关键角色,它使得数据能够适配并显示在ListView、GridView等视图组件中。然而,在实际应用中,我们常常遇到Adapter与CheckBox、EditText等交互控件冲突的问题。这...
在Android开发中,ListView是一种常用的...自定义Adapter是Android开发中的核心技能之一,掌握好这一技巧,能帮助我们实现各种复杂的界面效果。通过不断实践和优化,我们可以在保证性能的同时,让用户体验更加出色。
在这个"android gridview adapter 实例"中,我们将深入探讨如何使用Adapter来填充GridView,并实现每个GridView的item(单元格)显示不同的数据。 首先,理解Adapter在Android中的作用至关重要。Adapter是连接数据...
在Android开发中,Adapter是一个至关重要的组件,它作为数据源与UI控件之间的桥梁,使得数据能够被适配并显示在界面中。本项目聚焦于自定义Adapter的实现,特别是如何将其应用于ListView的数据显示。 首先,理解...
总之,理解并熟练掌握ListView与Adapter的使用是Android开发中的重要技能。ArrayAdapter适合简单的数据展示,SimpleAdapter能处理稍微复杂的结构,而BaseAdapter则提供了最大的灵活性,适用于各种定制需求。通过实践...
在Android开发中,Adapter是一个非常重要的组件,它起到了数据源与UI展示之间的桥梁作用。本文将深入探讨Android的Adapter机制,以及如何使用各种Adapter来加载数据。 首先,我们需要理解Adapter的基本概念。...
在Android开发中,ListView是展示大量数据的一种常见方式,而Adapter则是实现ListView数据绑定的关键组件。本篇文章将详细探讨Android中的Adapter用法及其在ListView中的应用。 1. **Adapter的概念** - `Adapter`...
Android Adapter里面嵌套ListView实例详解是Android开发中的一种常见设计,即在一个ListView中嵌套另一个ListView。这种设计可以实现复杂的列表显示,但是需要特殊处理以确保正确显示。 Android Adapter里面嵌套...
"Android ListView adapter不同布局"这个主题就是关于如何在ListView中实现这样的功能。 首先,我们了解ListView的工作原理。ListView依赖于Adapter来填充数据。Adapter就像一个桥梁,连接数据源(如ArrayList)和...
android recyclerview adapter 照片选择器 给recyclerview 添加adapter适置器进行照片选择,可以对recyclerview进行行数和张数的设置,也可以对已选择的照片进行增减。
在Android开发中,Adapter是一个非常重要的组件,它起到了数据源与UI展示之间的桥梁作用。本文将深入探讨Android适配器的使用,特别是针对初学者,旨在帮助他们更好地理解和掌握这一核心概念。 首先,我们来理解...
在Android开发中,Adapter是一种用于连接数据源和视图组件的重要桥梁。它主要用于处理数据集合与列表视图之间的交互,确保视图能够正确且高效地展示数据。Adapter的存在极大地简化了开发者的工作,使得他们能够更加...
在Android开发中,Adapter是一个非常重要的组件,它用于在数据集和UI视图之间建立桥梁,使得数据能够被适配并展示在各种视图控件中,如ListView、RecyclerView等。"万能Adapter"的概念旨在创建一个高度复用、灵活...
该例中包含了常用的Adapter的使用,如baseadapter、simpleAdapter、SimlpeCursorAdapter和ArrayAdapter,例子写在一个工程中的。请注意切换清单文件中启动的Activity。
在Android开发中,`RecyclerView` 是一个非常重要的组件,它用于展示可滚动的列表或网格视图,提供了高效的数据展示和内存管理。然而,当涉及到复杂的视图绑定和数据更新时,传统的方式可能会变得繁琐。这就是`...
Android Adapter 是 Android 开发中一个重要的组件,负责将数据绑定到用户界面中。今天,我们将深入探讨 Android Adapter 的原理和实现方式。 什么是 Android Adapter? Android Adapter 是一个接口,负责将数据...