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; } }

  至此大数据的优化完成,系统效率提高不少

  

原文地址:https://www.cnblogs.com/hack132/p/4173367.html