ArrayAdapter和SimpleCursorAdapter使用ArrayAdapter定制To-Do List?这个例子将扩展To-Do List工程,以一个
使用ArrayAdapter定制To-Do List
?
这个例子将扩展To-Do List工程,以一个ToDoItem对象来储存每一个项目,包含每个项目的创建日期。
?
你将扩展ArrayAdapter类来绑定一组ToDoItem对象到ListView上,并定制用于显示每一个ListView项目的layout。
?
1. 返回到To-Do List工程。创建一个新的ToDoItem类来保存任务和任务的创建日期。重写toString方法来返回一个项目数据的概要。
?
Java代码?- 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对象。
?
Java代码?- 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代码?- <?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。
Java代码?- ???
- 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来显示联系人信息:
?
Java代码?- 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(