Android ViewHolder的理解

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;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值