为什么要使用ViewHodler,因为使用ViewHodler可以节省程序的内粗你开销,具体如下:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
final Menu _m = (Menu)list.get(position);
if(convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.addappslist_item,null);
holder.flagImage = (MyImageButton)convertView.findViewById(R.id.addapps_flagimage);
holder.icon = (ImageView)convertView.findViewById(R.id.addapps_icon);
holder.title = (TextView)convertView.findViewById(R.id.addapps_title);
//Sets the tag associated with this view. A tag can be used to mark a view in its hierarchy
//and does not have to be unique within the hierarchy. Tags can also be used to store data
//within a view without resorting to another data structure.
convertView.setTag(holder); //关联Tag,Tag可以被用来存储与View相关的数据结构
} else {
holder = (ViewHolder)convertView.getTag();
}
if(_m.getBelong() == 1) {
holder.flagImage.setBackgroundResource(R.drawable.add_button);
holder.flagImage.setPosition(position);
holder.flagImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
_m.setBelong(0);
dButil.updateOneMenu9Item(_m);
list = dButil.readMenu9Items();
}
});
} else {
holder.flagImage.setBackgroundResource(R.drawable.noadd_button);
holder.flagImage.setEnabled(false);
}
holder.icon.setBackgroundDrawable(_m.getIcon());
if(_m.getTitle().contains("概况")) {
holder.title.setText(INI.REGION_CN + _m.getTitle());
} else {
holder.title.setText(_m.getTitle());
}
return convertView;
}
class ViewHolder {
TextView title;
ImageView icon;
MyImageButton flagImage;
}
上面是我工程中的一个Adapter中的片段,我们可以使用View.setTag(Object o) 将该View对应的数据结构保存在一个对象中,而不用在getView时每次都调用inflate来创建view的对象。据说inflate是十分占用内存的!!!