前面總結了如何應用android自帶的布局到ListView中去,現在如果想讓自己的ListView更生動,只需要將自己定義的布局應用到ListView中,在布局中添加壹些生動的元素,比如,圖標。
壹、為ListView每個item添加壹個圖標
先看效果:首先定義壹個entry.xml布局文件:
[html]?view plaincopyprint?
1<span?style="font-size:18px;">?
2<?xml?version="1.0"?encoding="utf-8"?>?
3<LinearLayout?xmlns:android="/apk/res/android"?
4android:layout_width="fill_parent"?
5 android:layout_height="60dp"?
? 6 ?android:orientation="horizontal"?>?
? 7 ?<!--?圖標?-->?
8 <ImageView
9 android:layout_width="48dp"?
?10android:layout_height="48dp"?
?11android:src="@drawable/preview"?
?12android:layout_gravity="center"?
?13android:layout_marginLeft="10dp"?
? 14 ? />?
15 <!--?這裏引用android自帶的布局simple_list_item_1?-->?
16<include
? 17 ? layout="@android:layout/simple_list_item_1"?
? 18 ? />?
19</LinearLayout>?
2021</span>?
然後將此布局文件應用到ListView中去:
1[java]?view plaincopyprint?
2<span?style="font-size:18px;">?
3public?class?ListViewDemo?extends?ListActivity?{?
4 5 ? private?List<Map<String,String>>?data?=?new?ArrayList<Map<String,String>>();?6@Override?
7 public?void?onCreate(Bundle?savedInstanceState)?{?
8 super.onCreate(savedInstanceState);?
9 setContentView(R.layout.main);?
?10 ? Map<String,?String>?map1?=?new?HashMap<String,?String>();?
11map1.put("姓名",?"A君");?
12 data.add(map1);?
?13 ? Map<String,?String>?map2?=?new?HashMap<String,?String>();?
? 14 ?map2.put("姓名",?"B君");?
15 data.add(map2);?
16 setListAdapter(new?SimpleAdapter(this,data,R.layout.entry,?
17 new?String[]{"姓名"},?
18 new?int[]{android.R.id.text1}?
? 19 ?));?
20 }?
2122</span>?
二、動態設置圖標
以上例子,處理的非常簡單,全部圖標都壹樣,現在要想動態設置每個item中元素,需要繼承Adapter子類,通過重寫getView()函數,為每個item都設置不同的風格。
下面創建BaseAdapter的子類MyAdapter:
[java]?view plaincopyprint?
1<span?style="font-size:18px;">?
2private?class?MyAdapter?extends?SimpleAdapter{?
3 //icons存儲圖標的id?
4 private?int[]?icons?=?null;?
?5
6private?Context?context;?
78 public?MyAdapter(Context?context,?List<?extends?Map<String,?>>?data,?
9 int?resource,?String[]?from,?int[]?to,int[]?icons)?{?
10super(context,?data,?resource,?from,?to);?
? 11 ?//?TODO?Auto-generated?constructor?stub?
12 this.icons?=?icons;//傳入存儲圖標id的數組?
? 13 ?this.context?=?context;?
? 14 ?}?
1516 /*?(non-Javadoc)?
?17*?重寫getView函數,由於SimpleAdapter能處理TextView,僅僅是不能設置圖標?
18 */所以,只需要在調用父類的getView函數的基礎上,設置上相應的圖標即可?
? 19 ?@Override?
? 20 public?View?getView(int?position,?View?convertView,?ViewGroup?parent)?{?
2 1 ? //?TODO?Auto-generated?method?stub?
?22 ?ViewHolder?holder?=?null;?
?23 ? if(convertView?==?null){?
? 24 holder?=?new?ViewHolder();?
?25convertView?=?super.getView(position,?convertView,?parent);//調用父類的getView函數,設置TextView?
?26?holder.imageView?=?(ImageView)convertView.findViewById(R.id.myimageview);?
? 27 ?convertView.setTag(holder);?
? 28 ?}else?{?
29 holder?=?(ViewHolder)convertView.getTag();?
? 30 ?}?
31//從icons中隨機選出壹個,並設置作為item的圖標?
32Random?random?=?new?Random();?
33 int?index?=?random.nextInt(icons.length);?
? 34 ?holder.imageView.setImageResource(icons[index]);?
35 ?
? 36 ?return?convertView;?
? 37 ?}?
? 38
39private?class?ViewHolder{?
?40 ? ImageView?imageView;?
41 }?
42 }?
4344</span>?
MyAdapter繼承自SimpleAdapter,重寫getView()函數,使listView中每個item的圖標都是隨機選擇的。對MyAdapter的應用如下:
[html]?view plaincopyprint?
1<span?style="font-size:18px;">?
2//數組存儲圖標id?
3private?int[]?myicons?=?{?R.drawable.preview,R.drawable.preview1,R.drawable.preview2,R.drawable.preview3};?
4 ?
5</span>?
[html]?view plaincopyprint?
1<span?style="font-size:18px;">?
2setListAdapter(new?</span><span?style="font-size:18px;color:#FF0000;">MyAdapter</span><span?style="font-size:18px;">(this,?data,?R.layout.entry,?new?String[]{"姓名"},?
3 new?int[]{android.R.id.text1},</span><span?style="font-size:18px;color:#FF0000;">?myicons</span><span?style="font-size:18px;">));//為ListView設置MyAdapter適配器?
45</span>?
上圖: