代码改变世界

Adapter子类创建AdapterView子类

2015-07-25 10:08  himanxu  阅读(566)  评论(0)    收藏  举报

本文以ListView(AdapterView的子类)为例,简要说明使用ArrayAdapter、SimpleAdapter和BaseAdapter(Adapter的子类)为其提供“内容”的方式。

使用ArrayAdapter和SimpleAdapter时,将ListView的列项布局定义在layout文件中,使用时都需要创建Adapter对象,区别在于,ArrayAdapter只能加载简单的TextView,而SimpleAdapter则更加灵活,listView的列项可以由多个控件组成。因而前者的layout就是TextView布局,而后一般包含各种控件.

创建Adapter对象时,分别采用:

ArrayAdapter<Object>adapter = new ArrayAdapter<Object>

                  (this,R.layout.array_items,arr);//这里的arr是listView的列项内容组成的数组

而对于SimpleAdapter,由于列项内容较多,要现将每个列项中的内容封装,多个列项最后组成数组或list

封装单个列项:List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();

for (int i=0;i<length;i++){

  Map<String, Object>listItems = new HashMap<String, Object>();

  listItems.put(key,value);

  ...  

  listItems.add(listItem);

}

创建SimpleAdapter

SimpleAdapter adapter = new SimpleAdapter(this,listItems,R.layout.simple_item,

  new String[]{key0,key1,key2,...}

  new int[]{R.id.key0,R.id.key1,R.id.key2,...})  //此处为获取列项的layout中的控件id

 

而BaseAdapter则更加灵活,其列项布局在代码中动态生成,而无需再layout文件中预先设置

创建BaseAdapter

BaseAdapter adapter = BaseAdapter(){

  @Override

  public int getCount(){return item_number;}

  @Override

  public Object getItem(int position){return null;}

  @Override

  public  long getItemId(int position){return position;}

  @Override

  public View getView(int position,View convertView, ViewGroup parent){

    LinearLayout line = new LinearLayout(MainActivity.this);

    ImageView image = new imageView(MainActivity.this);

    TextView tv = new TextView(MainActivity.this);

    line.addView(image);

    line.addView(tv);

    return line;

  }

}  //关于BaseAdapter的生命周期有待学习

 

创建完Adapter之后,一定不要忘了list.setAdapter(adapter),设置adapter加载内容。