ListView中convertView和ViewHolder的工作原理

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/50208167 文章出自:薛瑄的博客

你也可以查看我的其他同类文章,也会让你有一定的收货!

ListView工作原理:

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

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

convertView

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

这里写图片描述

  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

    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.

public void setTag (Object tag)

我的理解: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);
        }
    }

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

关注我的公众号,轻松了解和学习更多技术
这里写图片描述

发布了244 篇原创文章 · 获赞 799 · 访问量 234万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览