Adapter用来把数据绑定到扩展了AdapterView类的视图组(例如:ListView或Gallery)。Adapter负责创建代表所绑定父视图中的底层数据的子视图。
可以创建自己的Adapter类,构建自己的由AdapterView派生的控件。
也就是上述的各个类都可以使用Adapter类。
Adapter类解析:
在很多时候,都不需要从创建自己的Adapter。Android提供了一个Adapter集合,用于从公共数据源(包括数组和游标)来向扩展了AdapterView的原生控件提供数据。因为Adapter既负责提供数据,又负责创建代表每一条目的视图,所以Adapter可以从根本上修改它所绑定的控件的外观和功能。
Android SDK提供了多种Adapter,比如:ArrayAdapter、SimpleCursorAdapter等...
ArrayAdapter使用泛型来把Adapter视图绑定到一个指定类的对象的数组。默认情况下,ArrayAdapter使用数组中每个对象的toString值来创建和填充文本视图。
SimpleCursorAdapter可以把一个布局中的视图和游标的特定列绑定到一起。可以指定一个将被填充以显示每个子视图的XML布局,然后把游标中的每一列和那个布局中的特定视图进行绑定。Adapter将为每一个游标项创建一个新的视图,并将布局填充到视图中,使用游标中对应列的值填充布局中的每个视图。
在大多数情况下,需要定制ArrayAdapter来填充每个视图使用的布局,以表示底层的数组数据。为此需要使用特定类型的变体来扩展ArrayAdapter,并重写getView方法来向布局视图分配对象属性。
其中的getView()的参数描述了要显示的条目的位置,要更新的视图,以及将包好这个新视图的视图组。getItem()将返回存储在底层数组的指定索引位置的值。
1 自定义的ArrayAdapter
实例效果如下:
每一个Item的View是自定义的View。
package com.demo.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.RelativeLayout; import android.widget.TextView; import com.demo.R; import com.demo.domain.ToDoItem; import java.sql.Date; import java.text.SimpleDateFormat; import java.util.List; public class ToDoItemAdapter extends ArrayAdapter<ToDoItem> { private int mResource; public ToDoItemAdapter(Context context, int resource, List<ToDoItem> objects) { super(context, resource, objects); // 初始化时,传递xml布局 this.mResource = resource; } @Override public View getView(int position, View convertView, ViewGroup parent) { RelativeLayout todoView; ToDoItem item = getItem(position); String taskString = item.getTask(); Date createdDate = item.getCreated(); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy"); String dataString = sdf.format(createdDate); if (convertView == null) { // 初始化View布局 todoView = new RelativeLayout(getContext()); String inflater = Context.LAYOUT_INFLATER_SERVICE; LayoutInflater li; li = (LayoutInflater) getContext().getSystemService(inflater); li.inflate(mResource, todoView, true); } else { todoView = (RelativeLayout) convertView; } TextView taskView = (TextView) todoView.findViewById(R.id.row); TextView dateView = (TextView) todoView.findViewById(R.id.tv_date); taskView.setText(taskString); dateView.setText(dataString); return todoView; } }
自定义ArrayAdapter时,其Item的View是自定义的xml定义的布局;与视图绑定的数据,也是来自自定义的实例类。
// 获取数据 ToDoItem item = getItem(position);
getItem()将返回存储在底层数组的指定索引位置的值。
布局文件:
<?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="match_parent" > <TextView android:id="@+id/tv_date" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentRight="true" android:background="@color/notepad_paper" android:fadingEdge="vertical" android:padding="10dp" android:scrollbars="vertical" android:textColor="#f000" /> <com.demo.view.TextViewDesign android:id="@+id/row" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_toLeftOf="@id/tv_date" android:fadingEdge="vertical" android:padding="10dp" android:scrollbars="vertical" android:textColor="@color/notepad_text" > </com.demo.view.TextViewDesign> </RelativeLayout>
实例类:
package com.demo.domain; import java.sql.Date; import java.text.SimpleDateFormat; /** * <功能描述> 待办事件实体类 * * @author Administrator */ public class ToDoItem { private String task; private Date created; public String getTask() { return task; } public Date getCreated() { return created; } public ToDoItem(String _task) { this(_task, new Date(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 自定义SimpleCursorAdapter
SimpleCursorAdapter用于将一个Cursor绑定到一个AdapterView,并使用一个布局来定义每个行/条目的UI。每个行的视图的内容是用底层Cursor中对应行的列值进行填充的。