天天看点

ListView与BaseAdapter的优化

1.listView利用BaseAdapter做适配器的时候,在初始化获取View或滚动获取View时,会在调用getView方法返回添加到ListView里面的View(即列表每一项的item),

具体方法为:

public View getView(int position, View convertView, ViewGroup parent)
           

所传递的三个参数position为添加的View的位置,parent一般为listView

而convertView,在listView的属性设置的fill_parent时,屏幕未填充满时全部为null。

   在listView的layout_height属性设置为wrap_content时,除了第一个为null,其他都不为空。

具体原因,因为listView所要装载的所有view不可能全部加载到内存中,所以在该View不显示时,就将该View回收掉。

以fill_parent为例:

1.当listView的view没有填充满parent时,每个convertView都为null,每一个item都需要通过LayoutInflater实例化。

2.当listView填充满了parent,此时传进来的convertView即为每个item的View,所以此时只需将convertView中的数据(如图片、文字等)替换为所需要的数据,

再返回该convertView即可,不需要再new一个View。

2.ViewHolder

之前经常在优化ListView的文章中见到ViewHolder,其实他不是Android的库函数,是需要自己定义的,内部成员为View的类。

使用原因为通过View的findViewById方法耗时较大,如果控件个数太多,会严重影响性能。

而通过setTag,getTag方法可以直接获取View里面的控件,大大减少时间。

以下使用方法转载于:here

class  ViewHolder{
			ImageView img;
			TextView  sitekey;
			TextView partname;
			TextView price;
			TextView value;
			TextView quantity_sold;
			TextView end_date;
			TextView jiantou;
		}
           
public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder holder = new ViewHolder();
			if(convertView==null){
				convertView = inflater.inflate(R.layout.good_list_item, null, false);
				holder.img = (ImageView) convertView.findViewById(R.id.img);
				holder.sitekey = (TextView) convertView.findViewById(R.id.sitekey);
				holder.partname = (TextView) convertView.findViewById(R.id.partname);
				holder.price = (TextView) convertView.findViewById(R.id.price);
				holder.value = (TextView) convertView.findViewById(R.id.value);
				holder.quantity_sold = (TextView) convertView.findViewById(R.id.quantity_sold);
				holder.end_date = (TextView) convertView.findViewById(R.id.end_date);
				holder.jiantou = (TextView) convertView.findViewById(R.id.jiantou);
				convertView.setTag(holder);
			}else{
				holder = (ViewHolder) convertView.getTag();
			}
			//设置holder
			holder.img.setImageResource(R.drawable.ic_launcher);
			holder.sitekey.setText(list.get(position).sitekey);
			holder.partname.setText(list.get(position).partname);
			holder.price.setText("$"+list.get(position).price);
			holder.value.setText("$"+list.get(position).value);
			holder.quantity_sold.setText("已售出:"+list.get(position).quantity_sold);
			holder.end_date.setText("截止日期:"+list.get(position).end_date);
			
			
			return convertView;
		}