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;
}