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,修改ArrayListArrayAdapter变量的类型,储存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对象中的taskdate属性指定给第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(this,R.layout.simplecursorlayout,myCursor,fromColumns,toLayoutIDs);

    myListView.setAdapter(myAdapter);

     

    SimpleCursorAdapter在本章前面的创建选择联系人的例子中使用过。你将在第6章学习到更多关于Content ProviderCursor的内容,那里你也将找到更多SimpleCursorAdapter的例子。

     

posted on 2009-08-03 15:20  xirihanlin  阅读(30191)  评论(0编辑  收藏  举报