Android中常用的Adapter的种类和用法
一、常用的adapter:
1、BaseAdapter:基础数据适配器,它的主要用途是将一组数据传到例如ListView等UI显示组件,继承自接口类Adapter,由于是基础类型,所以自由度高, 可以修改的地方多
2、SimpleAdapter:简单适配器,系统自定义了一些方法,可以重写这些方法
3、ArrayAdapter:数据和UI一对一,传入数据源和布局文件,完成显示
4、SimpleCursorAdapter:指向性适配器,指向数据库,可以方便地把数据库的内容以列表的形式展示出来
二、用法:
1、BaseAdapter:自己写构造体和方法,然后在getview中返回view到列表项绑定
2、SimpleAdapter:
格式:SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
其中:context是上下文,data指map对象数组,resource指布局文件,from指data中map对象所对应的键名,to指resource中控件id
3、ArrayAdapter:
格式:ArrayAdapter<String>(Context context, int resource, int textViewResourceId, String[] objects)
其中:context是上下文,resource指布局文件,textViewResourceId布局文件中绑定数据的控件id,objects数据数组
4、SimpleCursorAdapter :
格式:SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags)
其中:context是上下文,layout指布局文件,c指数据cusor,from指数据库列名,to值绑定的控件id,flags标识当数据改变调用onContentChanged()的时候,是否通知ContentProvider数据进行了改变
三、优化
每种adapter都有getview方法返回对应的view到控件,如果复写该方法就能返回自定义view到控件上显示,例如这样:
@Override
public View getView(int position, View convertView, ViewGroup parent)
{ View item = mInflater.inflate(R.layout.list_item_layout, null); ((TextView) item.findViewById(R.id.showtext)).setText(data[position]); return item; }
问题:上面的方法在少量的数据时不会有问题,但是大量的数据时,例如上百条,那消耗的系统资源就很大
解决方法:减少view创建次数
1、判断convertView是否已经创建,如果创建了就直接使用在进行数据绑定
@override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item_layout, null); } ((TextView) item.findViewById(R.id.showtext)).setText(data[position]); return convertView;
}
这样写就减少了view的创建次数,提高了效率,但是数据的绑定还是每次都重新绑定,效率还是不高,所以为了更一步提高效率,就使用下边的方法
2、ViewHolder的使用
原理:在ViewHolder中提前定义好绑定的对象,这样一次绑定就能一直使用,不用重新创建和绑定,相比上面提高了效率
class ChatListAdapter extends BaseAdapter {
private class ViewHolder { TextView showtext; }
//各种省略
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item_layout, null); holder = new ViewHolder(); holder.showtext= (TextView) convertView.findViewById(R.id.showtext);
//将holder放入view的tag中,方便下次直接读取,类似于缓存的概念 convertView.setTag(holder); } else {
//从tag中读出holder来 holder = (ViewHolder) convertView.getTag(); } holder.showtext.setText(...); return convertView; } }
至此大数据的优化完成,系统效率提高不少