首先来看使用Tag的情况。
@Override
public View getView(int position, View view, ViewGroup group) {
ViewHolder holder = new ViewHolder();
if(view==null){
view = inflater.inflate(R.layout.note_list_item, null);//加载列表项的布局文件.
holder.title = (TextView)view.findViewById(R.id.note_title);
holder.createtime = (TextView)view.findViewById(R.id.note_createtime);
holder.clock = (ImageView)view.findViewById(R.id.note_clock);
view.setTag(holder); //将view和holder进行绑定
}else{
holder = (ViewHolder)view.getTag();
}
String title = items.get(position);
title = title.length()>10 ? title.substring(0, 10)+"..." : title;
holder.title.setText(title);
holder.createtime.setText(times.get(position));
}
可以看到,本例使用了一个特别的ViewHolder类对组件进行保存。
private class ViewHolder{
private TextView title;
private TextView createtime;
private ImageView clock;
}
再来看下不使用Tag的情况:
@Override
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = mInflater.inflate(R.layout.multiple_checkbox_main_row, null);
}
TextView tN = (TextView) convertView.findViewById(R.id.multiple_title);
tN.setText((String)mList.get(position).get(NAME));
TextView tP = (TextView) convertView.findViewById(R.id.multiple_summary);
tP.setText((String)mList.get(position).get(PHONE_NUMBER));
}
可以发现不使用Tag获取View时每次都会调用View.findViewById(XXX)方法。
而使用Tag的时候由于控件已经保存到了Tag中所以不必再调用View.findViewById(XXX)方法。
Tag相当于一个缓存的作用,从而提升了程序的性能。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------分隔线 2014/12/4
getView()中的参数convertView什么时候才不为null呢。
经过试验,第一次加载ListView的时候convertView都是为空的。
只有当ListView中的item加载过之后隐藏(上下滑动在屏幕中隐藏)之后再重新显示的时候,convertView才不为null。