首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

ArrayAdapter跟SimpleCursorAdapter

2012-09-17 
ArrayAdapter和SimpleCursorAdapter使用ArrayAdapter定制To-Do List?这个例子将扩展To-Do List工程,以一个

ArrayAdapter和SimpleCursorAdapter

    使用ArrayAdapter定制To-Do List

    ?

    这个例子将扩展To-Do List工程,以一个ToDoItem对象来储存每一个项目,包含每个项目的创建日期。

    ?

    你将扩展ArrayAdapter类来绑定一组ToDoItem对象到ListView上,并定制用于显示每一个ListView项目的layout。

    ?

    1. 返回到To-Do List工程。创建一个新的ToDoItem类来保存任务和任务的创建日期。重写toString方法来返回一个项目数据的概要。

    ?

    Java代码?
    1. package?com.paad.todolist;??
    2. import?java.text.SimpleDateFormat;??
    3. import?java.util.Date;??
    4. ???
    5. public?class?ToDoItem?{??
    6. String?task;??
    7. Date?created;??
    8. ???
    9. public?String?getTask()?{??
    10. return?task;??
    11. }??
    12. ???
    13. public?Date?getCreated()?{??
    14. return?created;??
    15. }??
    16. ???
    17. public?ToDoItem(String?_task)?{??
    18. this(_task,?new?Date(java.lang.System.currentTimeMillis()));??
    19. }??
    20. ???
    21. public?ToDoItem(String?_task,?Date?_created)?{??
    22. task?=?_task;??
    23. created?=?_created;??
    24. }??
    25. ???
    26. @Override??
    27. public?String?toString()?{??
    28. SimpleDateFormat?sdf?=?new?SimpleDateFormat(“dd/MM/yy”);??
    29. String?dateString?=?sdf.format(created);??
    30. return?“(“?+?dateString?+?“)?“?+?task;??
    31. }??
    32. }??
    ?

    ?

    2. 打开ToDoList Activity,修改ArrayList和ArrayAdapter变量的类型,储存ToDoItem对象而不是字符串。然后,你将修改onCreate方法来更新相应的变量初始化。你还需要更新onKeyListener处理函数来支持ToDoItem对象。

    ?

    Java代码?
    1. private?ArrayList<ToDoItem>?todoItems;??
    2. private?ListView?myListView;??
    3. private?EditText?myEditText;??
    4. private?ArrayAdapter<ToDoItem>?aa;??
    5. ???
    6. @Override??
    7. public?void?onCreate(Bundle?icicle)?{??
    8. super.onCreate(icicle);??
    9. ???
    10. //?Inflate?your?view??
    11. setContentView(R.layout.main);??
    12. ???
    13. //?Get?references?to?UI?widgets??
    14. myListView?=?(ListView)findViewById(R.id.myListView);??
    15. myEditText?=?(EditText)findViewById(R.id.myEditText);??
    16. todoItems?=?new?ArrayList<ToDoItem>();??
    17. int?resID?=?R.layout.todolist_item;??
    18. aa?=?new?ArrayAdapter<ToDoItem>(this,?resID,?todoItems);??
    19. myListView.setAdapter(aa);??
    20. myEditText.setOnKeyListener(new?OnKeyListener()?{??
    21. public?boolean?onKey(View?v,?int?keyCode,?KeyEvent?event)??
    22. {??
    23. if?(event.getAction()?==?KeyEvent.ACTION_DOWN)??
    24. if?(keyCode?==?KeyEvent.KEYCODE_DPAD_CENTER)??
    25. {??
    26. ToDoItem?newItem;??
    27. newItem?=?new?ToDoItem(myEditText.getText().toString());??
    28. todoItems.add(0,?newItem);??
    29. myEditText.setText(“”);??
    30. aa.notifyDataSetChanged();??
    31. cancelAdd();??
    32. return?true;??
    33. }??
    34. return?false;??
    35. }??
    36. });??
    37. registerForContextMenu(myListView);??
    38. }??
    ?

    ?

    3. 如果你运行Activity,它将显示每个to-do项目,如图5-3所示。

    ?

    ArrayAdapter跟SimpleCursorAdapter

    图5-3

    ?

    4. 现在,你可以创建一个自定义的layout来显示每一个to-do项目。修改在第4章中创建的自定义layout,包含另外一个TextView,它将用于显示每个to-do项目的创建日期。

    ?

    Xml代码?
    1. <?xml?version=”1.0”?encoding=”utf-8”?>??
    2. <RelativeLayout?xmlns:android=”http://schemas.android.com/apk/res/android”??
    3. android:layout_width=”fill_parent”??
    4. android:layout_height=”fill_parent”??
    5. android:background=”@color/notepad_paper”>??
    6. <TextView??
    7. android:id=”@+id/rowDate”??
    8. android:layout_width=”wrap_content”??
    9. android:layout_height=”fill_parent”??
    10. android:padding=”10dp”??
    11. android:scrollbars=”vertical”??
    12. android:fadingEdge=”vertical”??
    13. android:textColor=”@color/notepad_text”??
    14. android:layout_alignParentRight=”true”??
    15. />??
    16. <TextView??
    17. android:id=”@+id/row”??
    18. android:layout_width=”fill_parent”??
    19. android:layout_height=”fill_parent”??
    20. android:padding=”10dp”??
    21. android:scrollbars=”vertical”??
    22. android:fadingEdge=”vertical”??
    23. android:textColor=”@color/notepad_text”??
    24. android:layout_alignParentLeft=”@+id/rowDate”??
    25. />??
    26. </RelativeLayout>??
    ?

    ?

    5. 创建一个新的类(ToDoItemAdapter),使用指定的ToDoItem变量来扩展一个ArrayAdapter。重写getView方法来将ToDoItem对象中的task和date属性指定给第4步创建的layout中的View。

    Java代码?
    1. ???
    2. import?java.text.SimpleDateFormat;??
    3. import?android.content.Context;??
    4. import?java.util.*;??
    5. import?android.view.*;??
    6. import?android.widget.*;??
    7. ???
    8. public?class?ToDoItemAdapter?extends?ArrayAdapter<ToDoItem>?{??
    9. int?resource;??
    10. ???
    11. public?ToDoItemAdapter(Context?_context,int?_resource,?List<ToDoItem>?_items)?{??
    12. super(_context,?_resource,?_items);??
    13. resource?=?_resource;??
    14. }??
    15. ???
    16. @Override??
    17. public?View?getView(int?position,?View?convertView,?ViewGroup?parent)??
    18. {??
    19. LinearLayout?todoView;??
    20. ToDoItem?item?=?getItem(position);??
    21. String?taskString?=?item.getTask();??
    22. Date?createdDate?=?item.getCreated();??
    23. SimpleDateFormat?sdf?=?new?SimpleDateFormat(“dd/MM/yy”);??
    24. String?dateString?=?sdf.format(createdDate);??
    25. if?(convertView?==?null)??
    26. {??
    27. todoView?=?new?LinearLayout(getContext());??
    28. String?inflater?=?Context.LAYOUT_INFLATER_SERVICE;??
    29. LayoutInflater?vi;??
    30. vi?=?(LayoutInflater)getContext().getSystemService(inflater);??
    31. vi.inflate(resource,?todoView,?true);??
    32. }??
    33. else??
    34. {??
    35. todoView?=?(LinearLayout)?convertView;??
    36. }??
    37. TextView?dateView?=?(TextView)todoView.findViewById(R.id.rowDate);??
    38. TextView?taskView?=?(TextView)todoView.findViewById(R.id.row);??
    39. dateView.setText(dateString);??
    40. taskView.setText(taskString);??
    41. return?todoView;??
    42. }??
    43. }??
    ?

    ?

    6. 最后,用ToDoItemAdapter替换ArrayAdapter的定义。

    ?

    private ToDoItemAdapter aa;

    ?

    在onCreate中,使用new ToDoItemAdapter来替换ArrayAdapter<String>的实例化。

    ?

    aa = new ToDoItemAdapter(this, resID, todoItems);

    ?

    7. 如果你运行Activity,它看起来如图5-4的截图。

    ?

    ArrayAdapter跟SimpleCursorAdapter

    图5-4

    ?

    使用SimpleCursorAdapter

    ?

    SimpleCursorAdapter允许你绑定一个游标的列到ListView上,并使用自定义的layout显示每个项目。

    ?

    SimpleCursorAdapter的创建,需要传入当前的上下文、一个layout资源,一个游标和两个数组:一个包含使用的列的名字,另一个(相同大小)数组包含View中的资源ID,用于显示相应列的数据值。

    ?

    下面的框架代码显示了如何构造一个SimpleCursorAdapter来显示联系人信息:

    ?

    Java代码?
    1. String?uriString?=?“content://contacts/people/”;??
    2. Cursor?myCursor?=?managedQuery(Uri.parse(uriString),?null,?null,?null,?null);??
    3. String[]?fromColumns?=?new?String[]?{People.NUMBER,?People.NAME};??
    4. int[]?toLayoutIDs?=?new?int[]?{?R.id.nameTextView,?R.id.numberTextView};??
    5. SimpleCursorAdapter?myAdapter;??
    6. myAdapter?=?new?SimpleCursorAdapter(

热点排行