使用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 项目的创建日期。
- <? xml version =”1.0” encoding =”utf-8” ?>
- < RelativeLayout xmlns:android =”http://schemas.android.com/apk/res/android”
- android:layout_width =”fill_parent”
- android:layout_height =”fill_parent”
- android:background =”@color/notepad_paper” >
- < TextView
- android:id =”@+id/rowDate”
- android:layout_width =”wrap_content”
- android:layout_height =”fill_parent”
- android:padding =”10dp”
- android:scrollbars =”vertical”
- android:fadingEdge =”vertical”
- android:textColor =”@color/notepad_text”
- android:layout_alignParentRight =”true”
- />
- < TextView
- android:id =”@+id/row”
- android:layout_width =”fill_parent”
- android:layout_height =”fill_parent”
- android:padding =”10dp”
- android:scrollbars =”vertical”
- android:fadingEdge =”vertical”
- android:textColor =”@color/notepad_text”
- android:layout_alignParentLeft =”@+id/rowDate”
- />
- </ RelativeLayout >
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, People.NAME};
- int [] toLayoutIDs = new int [] { R.id.nameTextView, R.id.numberTextView};
- SimpleCursorAdapter myAdapter;
- myAdapter = new SimpleCursorAdapter(
发表评论
- 浏览: 647346 次
- 性别:
- 来自: 北京
最新评论
-
龙宝宝吱吱
: 我现在知道是在部署的项目里找,可是找不到啊,一般这个文件会在什 ...
webservice浏览器远程调用测试 -
龙宝宝吱吱
: 这个webconfig文件在哪里啊,大神
webservice浏览器远程调用测试 -
yuer1218
: 正在学习这块,能把源码发我一份吗,12045464@qq.co ...
Android时钟的widget【安卓进化三十七】 -
hongshanguo
: 为嘛没有任务管理器的,求案例啊
近百android程序源码贡献 -
难得糊涂CN2010
: 最近一个项目要用到widget,可以送下源码不?dz.bita ...
Android时钟的widget【安卓进化三十七】
评论