在介紹數(shù)據(jù)綁定時,我們使用了系統(tǒng)自帶的 SimpleAdapter。Android 允許自定義 Adapter ,理論上可以使用任意的 View(Layout)來顯示數(shù)據(jù)。下圖是對 AndroidGraphics2DTutorial 做改動,使用自定義 Adapter 來顯示示例 Activity 列表。
http://wiki.jikexueyuan.com/project/android-development-tutorial/images/20.png" alt="" />
在例子中我們把原來的 AndroidGraphics2DTutorial 改名為 AndroidGraphics2DTutorial1,重新創(chuàng)建一個類 AndroidGraphics2DTutorial 來顯示示例列表。打算使用三個 View 來顯示列表中的一項,一個圖標(biāo)(例子中隨機使用了一些圖標(biāo)),一個文本框顯示示例 Activity 名稱,另一個文本框顯示示例的具體信息。在 res\layout 目錄下創(chuàng)建一個 activitylist.xml。內(nèi)容如下:
http://wiki.jikexueyuan.com/project/android-development-tutorial/images/21.png" alt="" />
這次我們不從 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 來顯示列表:
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,關(guān)鍵的是 public View getView(int position,View ConvertView,ViewGroup parent)。這個函數(shù)返回用來顯示沒個類別元素的 View的示例。例子中為 activitylist.xml 對應(yīng)的 Layout。
這個例子使用的列表框,自定義 Adapter 適用所有 AdapterView,如 Spinner,Gallery 等。
Tags: Android