Listview视图缓存优化

	/**
	 * 加工ListView中的条目
	 */
	@Override
	public View getView(final int position, View convertView, ViewGroup parent) {

		// 刚开始会先加载页面能够容纳个数的View,在往下翻会再加载一个,之后便会使用缓存的。
		// 加载View与View中的控件
		View view;
		ViewHolder holder;
		// 判断之前是否已经加载过
		if (convertView != null) {
			// 如果已经加载过View,那么使用缓存
			view = convertView;
			// 得到view容器
			holder = (ViewHolder) view.getTag();
		} else {
			// 如果没有加载过View,加载
			view = View.inflate(CallSmsSafeActivity.this,
					R.layout.list_callsmssafe_item, null);
			// 加载控件,给view容器设置控件
			holder = new ViewHolder();
			holder.tv = (TextView) view.findViewById(R.id.tv);

			holder.iv = (ImageView) view.findViewById(R.id.iv);
			// 设置标签,使View对象与容器关联
			view.setTag(holder);
		}
		
		//给控件设置内容
		holder.tv.setText(phone);
		holder.iv.setImageBitmap(bm);

		return view;
	}


	

	/**
	 * 缓存Item中的控件,Item中view的容器
	 */
	static class ViewHolder {
		TextView tv
		ImageView iv;
	}


说明:
ListView的视图优化可分为三步。
1.复用convertView,减少加载view。 
  如果convertView为空,那么说明还没有生成listview,需要加载页面中能看到个数的view。
  如果convertView不为空,这时已经生成了listview,并且可以复用convertView。

  if (convertView != null) {
	view = convertView;
  }else{
	view = View.inflate(xxx);
  }

2.编写view容器ViewHolder,将Item中的view添加到容器中。
  因为如果每次通过view.findViewById方法查找Item身上的控件,会非常消耗资源。
  所以可以使用一个view容器,在加载Item时,把所有的view添加进容器中,然后设置给item。
  后面再次复用Item时就不必每次查找view了而是直接使用容器中的view。

        if (convertView != null) {
		
		view = convertView;
		// 得到view容器
		holder = (ViewHolder) view.getTag();
	} else {
	
		view = View.inflate(CallSmsSafeActivity.this,R.layout.list_callsmssafe_item, null);
		// 加载控件,给view容器设置控件
		holder = new ViewHolder();
		holder.tv = (TextView) view.findViewById(R.id.tv);
		holder.iv = (ImageView) view.findViewById(R.id.iv);
		// 设置标签,使View对象与容器关联
		view.setTag(holder);
	}

3.ViewHolder类用static修饰
  如果是非静态的累,在一开始加载可见Item个数的时候,每次都会讲该类字节码加载到内存。
  如果使用static修饰,那么只需要将字节码加载到内存一次即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值