一、前言
最近初学android编程,在看到ListView的使用后,总是想不明白适配器(adapter)为什么会跟ListView在一起使用,这好像跟传统中的适配器(adpater)的作用不太像,适配器的主要作用是将不兼容的接口转换为兼容的接口。经过上网查资料和翻阅书籍资料后,发现其实适配器分为两种,传统的适配器称为类适配器,就是上面提到的那种。还有一种称为对象适配器,就是android里和ListView一起使用的适配器。
二、对象适配器
对象适配器以组合的方式将两个类对象适配起来,并且不仅可以适配某个类,也可以适配该类的任何子类。下面看一段代码,会发现很熟悉。这是一个优化过的ListView代码的模板。
public class MyAdapter extends BaseAdapter{
private LayoutInflater mInflate;
List<String> mDatas;
public MyDapter(Context context, List<String> datas){
this.m
}
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
ViewHolder holder = null;
if(convertView ==null){
holder = new ViewHolder();
convertView = mInflater.inflate(android.R.layout.simple_list_item_1,null);
holder.title = (TextView)convertView.findViewById(android.R.id.text1);
convertView.setTag(holder);
}else{
holder = (ViewHolder)convertView.getTag();
}
holder.title.setText(mDatas.get(position));
return convertView;
}
class ViewHolder{
TextView title;
}
}
在getView中,要是有一个item滑出界面,就会被认为是"废弃"的,就会加到RecycleBin中,convertView就会生成一个View对象,里面保存着“废弃”Item的数据,就不需要加载布局,再利用setTag将控件ID也缓存下来,下次进getView函数的时候,可以直接getTag获取缓存的控件ID,从而优化了性能。在android源码中的AbsListView.java中的obtainView中的实现可以看到convertView是怎么产生的。
View obtainView(int position, boolean[] isScrap) {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "obtainView");
isScrap[0] = false;
View scrapView;
scrapView = mRecycler.getTransientStateView(position);
if (scrapView == null) {
scrapView = mRecycler.getScrapView(position);
}
View child;
if (scrapView != null) {
child = mAdapter.getView(position, scrapView, this);
///......
} else {
///.....
}
} else {
child = mAdapter.getView(position, null, this);
///...
}
return child;
}
在mRecyler.getScrapView中尝试获取RecycleBin中是否有"废弃",有的话就将scrapView传入mAdapter.getView中,没有的话,传入一个null。
3、总结
这里可以看到ListView和适配器的使用,是一个经典的对象适配器的使用例子,也看到了ListeView优化背后的原理,初始android架构设计的高明之处。