在介紹數據綁定時,我們使用了系統自帶的SimpleAdapter。Android 允許自定義Adapter ,理論上可以使用任意的View(Layout)來顯示數據。下圖是對AndroidGraphics2DTutorial做改動,使用自定義Adapter來顯示示例Activity列表。
在例子中我們把原來的AndroidGraphics2DTutorial改名爲AndroidGraphics2DTutorial1,重新創建一個類AndroidGraphics2DTutorial來顯示示例列表。打算使用三個View來顯示列表中的一項,一個圖標(例子中隨機使用了一些圖標),一個文本框顯示示例Activity名稱,另一個文本框顯示示例的具體信息。在res\layout目錄下創建一個activitylist.xml。內容如下:
這次我們不從AndroidManifest.xml中讀取Activity列表,而是使用String Array資源。在res\value\string.xml 中添加下列Array資源:
<string-array name=”activity_name”>
<item>Bezier</item>
<item>Brush</item>
<item>Colors</item>
<item>Font</item>
<item>Image</item>
<item>Path</item>
<item>Pen</item>
<item>Shape</item>
<item>Transform</item>
</string-array>
<string-array name=”activity_info”>
<item>Bezier</item>
<item>Pattern ,Gradients</item>
<item>Colors</item>
<item>FontDemo, FontTypes</item>
<item>DrawMap, JumbleImage, SeeThroughImage</item>
<item>Polys, Paths</item>
<item>Lines, Dashes, LineCap,LineJoin</item>
<item>Oval ,Pear ,Shape2DDemo</item>
<item>Transform</item>
</string-array>
定義了這些資源後,可以在程序中使用自定義Adapter來顯示列表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
class
ActivityInfo{ int
iconIndex; String activityName; String activityInfo; } class
ActivityInfoAdapter extends
ArrayAdapter<ActivityInfo>{ int
resource; public
ActivityInfoAdapter(Context context, int
resourceId, List<ActivityInfo> objects) { super (context, resourceId, objects); resource=resourceId; } @Override public
View getView( int
position,View ConvertView,ViewGroup parent){ LinearLayout activityInfoView; ActivityInfo activityInfo=getItem(position); String activity_Name=activityInfo.activityName; String activity_Info=activityInfo.activityInfo; int
iconIndex=activityInfo.iconIndex; if (ConvertView== null ){ activityInfoView= new
LinearLayout(getContext()); String inflater=Context.LAYOUT_INFLATER_SERVICE; LayoutInflater vi; vi=(LayoutInflater)getContext().getSystemService(inflater); vi.inflate(resource, activityInfoView, true ); } else { activityInfoView=(LinearLayout)ConvertView; } TextView activity_NameView =(TextView)activityInfoView.findViewById(R.id.activityName); TextView activity_InfoView =(TextView)activityInfoView.findViewById(R.id.activityInfo); ImageView iconView =(ImageView)activityInfoView.findViewById(R.id.iconImage); activity_NameView.setText(activity_Name); activity_InfoView.setText(activity_Info); iconView.setImageResource(iconIndex); return
activityInfoView; } } public
class AndroidGraphics2DTutorial extends
ListActivity { private
ArrayList<ActivityInfo> activityInfos = new
ArrayList<ActivityInfo>(); private
ActivityInfoAdapter aa; private
final static
String packgeName= "com.pstreets.graphics2d" ; @Override public
void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); Resources res = getResources(); String[] activity_Names = res.getStringArray(R.array.activity_name); String[] activity_Infos = res.getStringArray(R.array.activity_info); for ( int
i= 0 ;i<activity_Names.length;i++){ ActivityInfo activityInfo= new
ActivityInfo(); activityInfo.activityName=activity_Names[i]; activityInfo.activityInfo=activity_Infos[i]; activityInfo.iconIndex=R.drawable.icon1+i; activityInfos.add(activityInfo); } aa= new
ActivityInfoAdapter( this ,R.layout.activitylist,activityInfos); setListAdapter(aa); } @Override protected
void onListItemClick(ListView l, View v,
int position,
long id) { ActivityInfo activityInfo = (ActivityInfo) l.getItemAtPosition(position); Intent intent =
new Intent(); intent.setClassName( this , packgeName+ ".example."
+activityInfo.activityName); startActivity(intent); } } |
類ActivityInfo定義列表每個元素的Data Model,爲Activity的Icon資源ID,Activity Name以及Activity Info.
類ActivityInfoAdapter爲自定義Adapter,關鍵的是public View getView(int position,View ConvertView,ViewGroup parent)。這個函數返回用來顯示沒個類別元素的View的示例。例子中爲activitylist.xml 對應的Layout。
這個例子使用的列表框,自定義Adapter適用所有AdapterView,如Spinner,Gallery等。