ViewHolder通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能。
getview的加载方法一般有以下三种种方式:
- 最慢的加载方式是每一次都重新定义一个View载入布局,再加载数据
public View getView(int position, View convertView, ViewGroup parent) {
View item = mInflater.inflate(R.layout.picture_item, null);
((TextView) item.findViewById(R.id.title)).setText(pictures.get(position).getTitle());
((ImageView) item.findViewById(R.id.image)).setImageResource(pictures.get(position).getImageId());
return item;
}
- 正确的加载方式是当convertView不为空的时候直接重新使用convertView从而减少了很多不必要的View的创建,然后加载数据
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.picture_item, null);
}
((TextView) convertView.findViewById(R.id.text)).setText(pictures.get(position).getTitle());
((ImageView) convertView.findViewById(R.id.icon)).setImageResource(pictures.get(position).getImageId());
return convertView;
}
- 最快的方式是定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可,ViewHolder的引入是为了简化((TextView) convertView.findViewById(R.id.text))这步
class ViewHolder{
public TextView title;
public ImageView image;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView == null){
convertView = inflater.inflate(R.layout.picture_item,null);
viewHolder = new ViewHolder();
viewHolder.title = (TextView)convertView.findViewById(R.id.title);//ViewHolder和convertView联系起来
viewHolder.image = (ImageView)convertView.findViewById(R.id.image);
convertView.setTag(viewHolder);
} else{
viewHolder = (ViewHolder)convertView.getTag();
}
viewHolder.title.setText(pictures.get(position).getTitle());
viewHolder.image.setImageResource(pictures.get(position).getImageId());
return convertView;
}