ListView中convertView和ViewHolder的工作原理

参考:http://blog.csdn.net/bill_ming/article/details/8817172

ListView工作原理:

  1. ListView针对List中每个item,要求adapter给我一个视图(getView中返回的view)
  2. 一个view被返回并显示

如果我们有上亿个item要显示怎么办?为每个项目创建一个新视图?NO!这不可能~~~Android实际上为你缓存了视图

convertView

Android中有个叫做Recycler(反复循环器)的构件,下图是它的工作原理:

ListView中convertView和ViewHolder的工作原理_第1张图片

  1. 如果你有10亿个项目(item),其中只有可见的项目存在内存中(屏幕中存在的项目,只有完全不再屏幕内,才算不再内存中),其他的在Recycler中。
  2. ListView先请求一个Type1视图(getView),然后请求其他可见的项目。convertView在getView中是空(null)的。
  3. 当item1完全滚出屏幕,并且一个新的项目从屏幕底端上来时,ListView再请求一个Type1视图。convertView此时不是空值了,它的值是item1。此时就可以使用convertView,填充新的数据即可
    不必重新创建一个View。

ViewHolder

  • ViewHolder是将多个view封装一个对象

  • 使用View的setTag()方法将ViewHolder的对象缓存起来供下次调用。

  • getTag()判断是否有缓存的数据ViewHolder

public void setTag (Object tag)

Sets the tag associated with this view. A tag can be used to mark a view in its hierarchy and does not have to be unique within the hierarchy. Tags can also be used to store data within a view without resorting to another data structure.

我的理解:ViewHolder 将一些view封装好,ViewHolder没有指定只能被谁使用,ViewHolder 存储的是一组view的对象,具体每个view的内容是什么,并不关心

示例代码



public View getView(int position, View convertView, ViewGroup parent) { View view; ViewHolder mViewHolder; if (convertView == null || convertView.getTag() == null) { view = mInflater.inflate(R.layout.item_viewpicture_gridview, null); mViewHolder = new ViewHolderGridView(view); view.setTag(mViewHolder); } else { view = convertView; mViewHolder = (ViewHolderGridView)convertView.getTag(); } return view;
public static class ViewHolder {
        public ImageView pictureImageView;
        public ImageView pictureChooseflag;

        public ViewHolderGridView(View view) {
            pictureImageView = (ImageView) view.findViewById(R.id.picture_img);
            pictureChooseflag = (ImageView) view.findViewById(R.id.picture_choose_flag);
        }
    }

你可能感兴趣的:(ListView中convertView和ViewHolder的工作原理)