自定义适配器的getView()方法中未优化的原代码:
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
LayoutInflater layoutInflater = LayoutInflater.from(context);
View view =layoutInflater.inflate(R.layout.list_item_10,null);
ImageView imageView_icon = view.findViewById(R.id.imageView);
TextView textView_title = view.findViewById(R.id.textView_title);
imageView_icon.setImageResource(images[position]);
textView_title.setText(title[position]);
return view;
}
1. 使ListView 组件宽高固定为继承父组件宽高(match_parent),避免重复渲染
如果使用以内容决定宽高大小(wrap_content)的话,适配器每一次set值的时候,都会做一次对ListView重新渲染,这些行为显然是无用得。当将组件直接设置为匹配父组件时,就可以避免了。
2. 重复使用 convertView 减少对象的创建
从原代码可看出,适配器每一次的setImage 和Text 时都需要申明一个空间来装载。
打印getView 的传入值convertView 值可发现,它在起初都为null 。若数据量大于页面可显示量时,且当之前创建的对象未在屏幕上显示时,convertView 的值就不会为null了。因此我们可以利用convertView 来进行优化对象的创建。
3. 使用 ViewHolder 减少对组件的查找
每一次set Images 和Text 时,我们都需要去查找它们的 id,当数据量足够大时,这就会影响运行效率。尽量减少每一个地方对效率的影响,可能就是一个较大的改变。
优化之后的代码
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
// 已优化的代码
ViewHolder viewHolder;
if(convertView == null) {
// 实例化布局文件
LayoutInflater layoutInflater = LayoutInflater.from(context);
convertView = layoutInflater.inflate(R.layout.list_item_10, null);
viewHolder = new ViewHolder();
viewHolder.imageView_icon = convertView.findViewById(R.id.imageView);
viewHolder.textView_title = convertView.findViewById(R.id.textView_title);
convertView.setTag(viewHolder);
}else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.imageView_icon.setImageResource(images[position]);
viewHolder.textView_title.setText(title[position]);
return convertView;
}
// 用于保存第一次查找的组件,避免下次重复查找
// 内部类首选 static,不依赖于外部对象,效率最高
static class ViewHolder{
ImageView imageView_icon;
TextView textView_title;
}