上一篇使用了lsitview及自定义BaseAdapter,不难发现其中代码有很大的缺陷,在MyBaseAdapter中getView()方法会有重复加载布局的情况,这将会使listView的运行效率降低,因此需要进行优化。本文章为学习《第一行代码》过程小结笔记。
优化步骤如下:
①我们可以利用好convertView这个参数将之前加载好的布局进行缓存,以便后面可以重用,不用重新加载,主要是对getView()方法中进行判断,如果convertView为空;则使用layoutInflater去加载布局,否则直接堆convertView进行重用;
②新增内部类ViewHolder,用于对控件的实例进行缓存。当convertView为空的时候,创建一个ViewHolder对象,并将控件的实例都存放在ViewHolder,调用setTag()方法将ViewHolder对象存储在View中的getTag()方法,把ViewHolder重新取出。
优化代码如下:
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
if(view==null) {
view = LayoutInflater.from(mContext).inflate(R.layout.item, viewGroup, false);
viewHolder = new ViewHolder();
viewHolder.img_icon = (ImageView) view.findViewById(R.id.pic);//利用view对象找到布局中的组件
viewHolder.txt_title = (TextView) view.findViewById(R.id.title);
viewHolder.txt_context = (TextView) view.findViewById(R.id.context);
view.setTag(viewHolder);
}else
{
viewHolder= (ViewHolder) view.getTag();
}
viewHolder.img_icon.setBackgroundResource(mData.get(i).getIcon());
viewHolder.txt_title.setText(mData.get(i).getTitle());
viewHolder.txt_context.setText(mData.get(i).getContext());
return view;
}
static class ViewHolder {
ImageView img_icon;
TextView txt_title;
TextView txt_context;
}
}