使用ViewHolder对ListView做优化

问题描述:Adapter给ListView做适配的时候,当List中条目数据过多时,会极大地消耗内存,即使复用convertView,还是需要每次都去找到convertView中的控件(findViewById方法)最后可能导致应用的崩溃,如何进行优化?

分析:现在已经可以复用convertView了,因此最好减少找到converiView内部控件的次数,因此可以创建一个ViewHolder容器,里面存放每个item里面的所有控件,并将这个类设为静态的,每当convertView为null时,则查找其内部的控件,给ViewHolder内的控件赋值;每当convertView不为null时,只要获取到之前设置给convertView的ViewHolder对象即可则直接复用该Holder中的控件,而无需重新进行控件的查找过程,以此达到优化的目的。

实现:

(1)现假设ListView每个条目的布局中有三个控件,分别是textView1,textView2,imageView1。因此构造一个ViewHolder静态类,包含这三个控件。

static class ViewHolder {

		TextView textView1;
		TextView  textView2;
		ImageView imageView1;

	}
(2)在重写BaseAdapter的getView()方法中,编写以下代码:

@Override
public View getView(final int position, View convertView,ViewGroup parent) {
		
	// 复用ViewHolder步骤一
	ViewHolder holder = null;
	if (convertView == null) {
		convertView = View.inflate(getApplicationContext(),R.layout.listview_XXX_item, null);
		// 2.减少findviewbyid的次数
		holder = new ViewHolder();
		holder.textView1= (TextView) convertView.findViewById(R.id.textView1);
		holder.textView2= (TextView) convertView.findViewById(R.id.textView2);
		holder.imageView1= (ImageView) convertView.findViewById(R.id.imageView1);
		// 将Holder对象设置给convertView
		convertView.setTag(holder);
         } else {
		//下次复用的时候直接将Holder对象取出来用,而无需寻找控件
		holder = (ViewHolder) convertView.getTag();
		}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值