- item布局,层级越少越好,使用hierarchy view,这是因为层级越多,布局耗费太多时间,导致性能差。
- 复用converView,重用缓存convertView传递给getView()方法来避免填充不必要的视图。
- 使用ViewHolder,使用ViewHolder模式来避免没有必要的调用findViewById():因为太多的findViewById也会影响性能。
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder viewHolder;
Item item = getItem(position);
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(layoutId, parent, false);
viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) view.findViewById(R.id.item_img);
viewHolder.textView = (TextView) view.findViewById(R.id.item_text);
view.setTag(viewHolder);
} else {
// 直接通过holder获取下面三个子控件,不必使用findviewbyid,加快了 UI 的响应速度
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.imageView.setImageResource(item.getImgId());
viewHolder.textView.setText(item.getName());
return view;
}
// 避免每次调用getView()的时候调用findViewById()
class ViewHolder {
ImageView imageView;
TextView textView;
}
- item中有图片的时候,使用异步加载,并且对图片进行适当压缩。
- 快速滑动的时候,不加载图片,防止图片错位。原因:convertView 复用的时候加载Image失败,导致显示的还是上一张图片,或者上一张加载太慢,复用convertView的时候又加载成功了,就显示了上一张的图片。
// 给 ImageView 设置一个 tag
holder.img.setTag(imgUrl);
// 预设一个图片
holder.img.setImageResource(R.drawable.ic_launcher);
// 通过 tag 来防止图片错位
if (imageView.getTag() != null && imageView.getTag().equals(imageUrl)) {
imageView.setImageBitmap(result);
}
- 实现数据的分页加载