提高ListView运行效率

提高ListView的运行效率:

                                                         ——整理自《第一行代码》

1.getView()方法中还有一个 convertView 参数,这个参数用于将之前加载好的布局进行缓存,以便之后可以进行重用

View view;

    if (convertView == null) {

      view = LayoutInflater.from(getContext()).inflate(resourceId, null);

    } else {

      view = convertView;

    }

getView()方法中进行了判断,如果 convertView 为空,则使用LayoutInflater 去加载布局,如果不为空则直接对 convertView进行重用。这样就大大提高了ListView的运行效率,在快速滚动的时候也可以表现出更好的性能

2.每次在getView()方法中还是会调用View的findViewById()方法来获取一次控件的实例。我们可以借助一个 ViewHolder来对这部分性能进行优化

class ViewHolder {

    ImageView fruitImage;

    TextView fruitName;

  }

View view;

    ViewHolder viewHolder;

    if (convertView == null) {

      view = LayoutInflater.from(getContext()).inflate(resourceId, null);

      viewHolder = new ViewHolder();

      viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);

      viewHolder.fruitName = (TextView) view.findViewById(R.id.fruit_name);

      view.setTag(viewHolder); // 将ViewHolder 存储在View 中

    } else {

      view = convertView;

      viewHolder = (ViewHolder) view.getTag(); // 重新获取ViewHolder

    }

    viewHolder.fruitImage.setImageResource(fruit.getImageId());

    viewHolder.fruitName.setText(fruit.getName());

新增了一个内部类 ViewHolder,用于对控件的实例进行缓存。

当 convertView为空的时候,创建一个 ViewHolder对象,并将控件的实例都存放在 ViewHolder 里,然后调用 View的 setTag()方法,将 ViewHolder 对象存储在 View 中。

当 convertView 不为空的时候则调用View的 getTag()方法,把 ViewHolder 重新取出。这样所有控件的实例都缓存在了 ViewHolder里,就没有必要每次都通过 findViewById()方法来获取控件实例了。

猜你喜欢

转载自blog.csdn.net/qq_34149526/article/details/82947136