Android 内存优化之ListView

20161107103047662.png
  1. item布局,层级越少越好,使用hierarchy view,这是因为层级越多,布局耗费太多时间,导致性能差。
  2. 复用converView,重用缓存convertView传递给getView()方法来避免填充不必要的视图。
  3. 使用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;
}
  1. item中有图片的时候,使用异步加载,并且对图片进行适当压缩。
  2. 快速滑动的时候,不加载图片,防止图片错位。原因: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);
}
  1. 实现数据的分页加载

你可能感兴趣的:(Android 内存优化之ListView)