Android简明开发教程十一:自定义Adapter显示列表

jerry Android 2015年08月24日 收藏

在介绍数据绑定时,我们使用了系统自带的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. class ActivityInfo{
  2.  int iconIndex;
  3.  String activityName;
  4.  String activityInfo;
  5. }
  6.  
  7. class ActivityInfoAdapter extends ArrayAdapter<ActivityInfo>{
  8.  
  9.  int resource;
  10.  public ActivityInfoAdapter(Context context, int resourceId,
  11.    List<ActivityInfo> objects) {
  12.   super(context, resourceId, objects);
  13.   resource=resourceId;
  14.  }
  15.  
  16.  @Override
  17.  public View getView(int position,View ConvertView,ViewGroup parent){
  18.   LinearLayout activityInfoView;
  19.   ActivityInfo activityInfo=getItem(position);
  20.   String activity_Name=activityInfo.activityName;
  21.   String activity_Info=activityInfo.activityInfo;
  22.   int iconIndex=activityInfo.iconIndex;
  23.   if(ConvertView==null){
  24.    activityInfoView=new LinearLayout(getContext());
  25.    String inflater=Context.LAYOUT_INFLATER_SERVICE;
  26.    LayoutInflater vi;
  27.    vi=(LayoutInflater)getContext().getSystemService(inflater);
  28.    vi.inflate(resource, activityInfoView,true);
  29.   }else{
  30.    activityInfoView=(LinearLayout)ConvertView;
  31.   }
  32.   TextView activity_NameView
  33.     =(TextView)activityInfoView.findViewById(R.id.activityName);
  34.   TextView activity_InfoView
  35.      =(TextView)activityInfoView.findViewById(R.id.activityInfo);
  36.   ImageView iconView
  37.      =(ImageView)activityInfoView.findViewById(R.id.iconImage);
  38.   activity_NameView.setText(activity_Name);
  39.   activity_InfoView.setText(activity_Info);
  40.   iconView.setImageResource(iconIndex);
  41.   return activityInfoView;
  42.   
  43.  }
  44. }
  45.  
  46. public class AndroidGraphics2DTutorial extends ListActivity {
  47.  
  48.  private ArrayList<ActivityInfo> activityInfos
  49.      =new ArrayList<ActivityInfo>();
  50.  private ActivityInfoAdapter aa;
  51.  private final static String packgeName="com.pstreets.graphics2d";
  52.  
  53.  @Override
  54.  public void onCreate(Bundle savedInstanceState) {
  55.   super.onCreate(savedInstanceState);
  56.   Resources res = getResources();
  57.   String[] activity_Names = res.getStringArray(R.array.activity_name);
  58.   String[] activity_Infos = res.getStringArray(R.array.activity_info);
  59.   for(int i=0;i<activity_Names.length;i++){
  60.    ActivityInfo activityInfo=new ActivityInfo();
  61.    activityInfo.activityName=activity_Names[i];
  62.    activityInfo.activityInfo=activity_Infos[i];
  63.    activityInfo.iconIndex=R.drawable.icon1+i;
  64.    activityInfos.add(activityInfo);
  65.   }
  66.   
  67.   aa=new ActivityInfoAdapter(this,R.layout.activitylist,activityInfos);
  68.   setListAdapter(aa);
  69.  }
  70.  
  71.  @Override
  72.  protected void onListItemClick(ListView l, View v, int position, long id) {
  73.   ActivityInfo activityInfo = (ActivityInfo) l.getItemAtPosition(position);
  74.   Intent intent = new Intent();
  75.   intent.setClassName(this,
  76.        packgeName+".example." +activityInfo.activityName);
  77.   startActivity(intent);
  78.  }
  79. }

类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等。