本文以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加载内容。