Android中的Adapter 详解(五)
2016-09-12 23:46
260 查看
ArrayAdapter和SimpleCursorAdapter例子:
使用ArrayAdapter定制To-Do List
这个例子将扩展To-Do List工程,以一个ToDoItem对象来储存每一个项目,包含每个项目的创建日期。
你将扩展ArrayAdapter类来绑定一组ToDoItem对象到ListView上,并定制用于显示每一个ListView项目的layout。
1. 返回到To-Do List工程。创建一个新的ToDoItem类来保存任务和任务的创建日期。重写toString方法来返回一个项目数据的概要。
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;
}
}); <span id="transmark"></span>
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;
}
}
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;
}
}
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)
使用ArrayAdapter定制To-Do List
这个例子将扩展To-Do List工程,以一个ToDoItem对象来储存每一个项目,包含每个项目的创建日期。
你将扩展ArrayAdapter类来绑定一组ToDoItem对象到ListView上,并定制用于显示每一个ListView项目的layout。
1. 返回到To-Do List工程。创建一个新的ToDoItem类来保存任务和任务的创建日期。重写toString方法来返回一个项目数据的概要。
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;
}
}); <span id="transmark"></span>
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;
}
}
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;
}
}
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)
相关文章推荐
- android Adapter使用详解
- Android中的Adapter 详解(二)
- android ArrayAdapter详解
- Android Adapter详解
- Android用户界面 UI组件--AdapterView及其子类(一) ListView及各种Adapter详解
- Android ArrayAdapter 详解
- Android中SimpleAdapter,ArrayAdapter和BaseAdapter详解
- Android之adapter详解
- Android ArrayAdapter 详解 .
- Android中adapter详解
- Android中的Adapter 详解(三)
- Android ArrayAdapter 详解
- Android GridView中GridAdapter 用法详解
- Android Adapter详解
- android开发--详解ListView,动态添加,删除Adapter中的数据项
- Android中的Adapter 详解(一)
- Android GridView中GridAdapter 用法详解
- Android ArrayAdapter 详解
- Android用户界面 UI组件--AdapterView及其子类(一) ListView及各种Adapter详解
- Android Adapter详解