第一种情况,就是extends
Activity
,而且事先也
setContentView(R.layout.main); 那么我定义的ListView就是在XML里面已经布局好了的。
18.
public
class
aGirlGallery
extends
Activity {
19.
/** Called when the activity is first created. */
20.
@Override
21.
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.
@Override
50.
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.
@Override
60.
public
void
onCreateContextMenu(ContextMenu menu, View v,
61.
ContextMenuInfo menuInfo) {
62.
//do something?
63.
}
64.
});
65.
}
66.
67.
// 长按菜单响应函数
68.
@Override
69.
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>