ListActivity的使用
第一种情况,就是extends Activity ,而且事先也
setContentView(R.layout.main); 那么我定义的ListView就是在XML里面已经布局好了的。
18.public class aGirlGallery extends Activity { 19. /** Called when the activity is first created. */20. @Override21. public void onCreate(Bundle savedInstanceState) { 22. super.onCreate(savedInstanceState); 23. setContentView(R.layout.main); 24. 25. // 绑定Layout里面的ListView 26. ListView list = (ListView) findViewById(R.id.lv); 27. 28. // 生成动态数组,加入数据 29. ArrayList<hashmap <String, Object>> listItem = new ArrayList</hashmap><hashmap <String, Object>>(); 30. for (int i = 0; i < 10; i++) { 31. HashMap<String, Object> map = new HashMap<string , Object>(); 32. map.put("ItemImage", R.drawable.icon);// 图像资源的ID 33. map.put("ItemTitle", "Level " + i); 34. listItem.add(map); 35. } 36. // 生成适配器的Item和动态数组对应的元素 37. SimpleAdapter listItemAdapter = new SimpleAdapter(this, listItem,// 数据源 38. R.layout.list_items,// ListItem的XML实现 39. // 动态数组与ImageItem对应的子项 40. new String[] { "ItemImage", "ItemTitle" }, 41. // list_items中对应的的ImageView和TextView 42. new int[] { R.id.ItemImage, R.id.ItemTitle }); 43. 44. // 绑定数据源 45. list.setAdapter(listItemAdapter); 46. 47. // 点击事件 48. list.setOnItemClickListener(new OnItemClickListener() { 49. @Override50. public void onItemClick(AdapterView< ?> arg0, View arg1, int position, 51. long id) { 52. //do something? 53. } 54. }); 55. 56. // 长按事件 57. list.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { 58. 59. @Override60. public void onCreateContextMenu(ContextMenu menu, View v, 61. ContextMenuInfo menuInfo) { 62. //do something? 63. } 64. }); 65. } 66. 67. // 长按菜单响应函数 68. @Override69. public boolean onContextItemSelected(MenuItem item) { 70. //do something? 71. return super.onContextItemSelected(item); 72. } 73.}
第一种情况,就是extends Activity ,但是事先没有setContentView(R.layout.main);
那么里面我的ListView是这样定义的listView = new ListView(this) 这里我的ListView还没有布局,所以最后还要setContentView(listView);
public class ActivityList2 extends Activity {
private List<Map<String, Object>> data;
private ListView listView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PrepareData();
listView = new ListView(this);
SimpleAdapter adapter = new SimpleAdapter(this, data,
R.layout.list_item, new String[] { "姓名", "性别" }, new int[] {
R.id.mview1, R.id.mview2 });
listView.setAdapter(adapter);
setContentView(listView);
OnItemClickListener listener = new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
setTitle(parent.getItemAtPosition(position).toString());
}
};
listView.setOnItemClickListener(listener);
}
private void PrepareData() {
data = new ArrayList<Map<String, Object>>();
Map<String, Object> item;
item = new HashMap<String, Object>();
item.put("姓名", "张三小朋友");
item.put("性别", "男");
data.add(item);
item = new HashMap<String, Object>();
item.put("姓名", "王五同学");
item.put("性别", "男");
data.add(item);
item = new HashMap<String, Object>();
item.put("姓名", "小李师傅");
item.put("性别", "女");
data.add(item);
}
}
第三种情况 ,是我extends ListActivity,那么其实本身是不用setContentView,Android也会自动帮我们构造出一个全屏的列表
- public class HelloTwoB extends ListActivity
- ...{
- public void onCreate(Bundle icicle) ...{
- super.onCreate(icicle);
- setTheme(android.R.style.Theme_Dark);
- setContentView(R.layout.mainb);
-
- List<String> items = fillArray();
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.list_row,items);
-
- this.setListAdapter(adapter);
- }
- private List<String> fillArray()
- ...{
- List<String> items = new ArrayList<String>();
- items.add("日曜日");
- items.add("月曜日");
- items.add("火曜日");
- items.add("水曜日");
- items.add("木曜日");
- items.add("金曜日");
- items.add("土曜日");
- return items;
- }
-
- @Override
- protected void onListItemClick(ListView l, View v, int position, long id)
- ...{
- TextView txt = (TextView)this.findViewById(R.id.text);
- txt.setText("あすは "+l.getSelectedItem().toString()+"です。");
- }
- }
複製代碼
的確可以簡單到只需準備一個List物件並借助Adapter就可以構造出一個列表。重載onListItemClick方法可以回應選擇事件,利用第一個參數可以訪問到這個ListView實例以得到選中的條目資訊。這裏有一點要說明的,就是如果更簡單的話,其實連那個setContentView都可以不要了,Android也會自動幫我們構造出一個全屏的列表。但是本例中我們需要一個TextView來顯示選中的條目,所以我們需要一個 layout.mainb描述一下這個列表視窗。
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- androidrientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView id="@+id/text"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text=""
- />
- <ListView id="@id/android:list"
- android:layout_width="fill_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- android:drawSelectorOnTop="false"
- />
- </LinearLayout>
複製代碼
這裏需要注意的是那個ListView的ID,是系統自定義的android:list,不是我們隨便取的,否則系統會說找不到它想要的listview了。然後,在這個listview之外,我們又增加了一個TextView,用來顯示選中的條目。
再來說說這裏用到的ArrayAdapter,它的構造函數中第二個參數是一個資源ID,ArrayAdapter的API文檔中說是要求用一個包含TextView的layout檔,平臺用它來顯示每個選擇條目的樣式,這裏的取值是R.layout.list_row,所以,我們還有一個list_row.xml檔來描述這個佈局,相當簡單。
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- androidrientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView id="@+id/item"
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <TextView id="@+id/item2"
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- </LinearLayout>
複製代碼
從ArrayAdapter上溯到BaseAdapter,發現還有幾個同源的Adapter也應該可以使用,象SimpleAdapter和CursorAdapter,還是做個例子來實驗一下吧。
浙公网安备 33010602011771号