Android中的holder模式,网上介绍的文章不多,其实在很多地方都有所应用。
在本博客的另外一篇文章中有对BaseAdapter的介绍,在重写getView方法时,随着Listview数目的增加,不断的执行getLayoutInflater的inflate方法获得view,再获得相应的布局子空间,这样的重复执行,无疑效率是很差的。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
convertView = getLayoutInflater().inflate(R.layout.lv_items, null);
TextView txt = (TextView)convertView.findViewById(R.id.txt);
txt.setText("第" + position + "个");
return convertView;
}
这时候Holder模式就可以派上用场了。
首先,声明Holder类:
class Holder{
TextView txt;
}
然后在getView中做相应处理:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Holder holder;
if(convertView==null){
holder = new Holder();
convertView = getLayoutInflater().inflate(R.layout.lv_items, null);
holder.txt = (TextView)convertView.findViewById(R.id.txt);
convertView.setTag(holder);//给convertView添加Holder,然后再用getTag()取出来
}else{
holder = (Holder)convertView.getTag();
}
holder.txt.setText("第" + position + "个");
return convertView;
}
可以看到所有的view都只执行了一次,如果ListView数量,控件很多的话,将会极大的提高了程序的效率。
比起其他的开发模式,这个Holder真是又小又可爱,大家一定会很喜欢。