鍍金池/ 教程/ Android/ 自定義 Adapter 顯示列表
Dialog 顯示圖像
線程 Bezier 曲線
創(chuàng)建應(yīng)用程序框架
引路蜂二維圖形庫簡介及顏色示例
Android 應(yīng)用基本概念
Intents 和 Intent Filters
安裝開發(fā)環(huán)境
Option Menu 畫筆示例
自定義對話框 Transform
數(shù)據(jù)綁定 Data Binding
概述
Broadcast Receiver 短信觸發(fā)示例
發(fā)布應(yīng)用
自定義 Adapter 顯示列表
RadioButton 多邊形及路徑繪制
訪問 Internet 繪製在線地圖
第一個應(yīng)用 Hello World
Activities
Button 畫刷示例
使用資源 Resources
Context Menu 繪制幾何圖形
用戶界面設(shè)計
引路蜂二維圖形繪制實例功能定義

自定義 Adapter 顯示列表

在介紹數(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