ListView中convertView和ViewHolder的工作原理

引言:

      android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,但当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,这时我们需要在getView()方法中使用convertView和ViewHolder类来解决,它们的工作原理分别如下:

      1)convertView---------->ListView的一级优化.

          工作原理:

                  Android程序渲染ListView遵循以下原则:

                         无论item项多少,只渲染当前屏的item项,被渲染过的item项,它的视图对象会被保存到Recycler(反复循环器)中.新滑入的item项将从recycler中来获取缓存视图,而不是在通过inflate方法反射获取,从而有效避免了反射方法的耗时.

                         Recycler中只需要缓存N+1个视图对象,即可保证整个ListView的显示(N为一层可显示的item数).这样无论item项有多少,inflate方法最多调用N+1次.

     2)ViewHolder----------->ListView的二级优化.

        工作原理:

               ViewHolder是一个类,它储存了通过findviewById获取来的控件对象,当convertView被新建时,ViewHolder也随之一起缓存到recycler中,当convertView被重新利用时,ViewHolder也随之取出,从而可以直接给各个控件赋值,而无需再次调用findviewById方法.

         Java代码中实现如下:

                  

 @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        //1.申明ViewHolder
        ViewHolder holder = null;
        //2. convertView进行非空判断
        if (convertView == null) {
            //用布局填充气泵 把layout转化程View
            convertView = LayoutInflater.from(context).inflate(R.layout.item, parent,false);
            //ViewHolder赋值
            holder = new ViewHolder();
            //ConverView中的控件赋给holder对象的属性
            holder.button = (Button) convertView.findViewById(R.id.button);
            holder.textView = (TextView) convertView.findViewById(R.id.tv_02);
            //holder类作为tag赋值
            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }
        //给控件进行赋值
        Map, String> map = data.get(position);
        holder.button.setText(map.get("button"));
        holder.textView.setText(map.get("textView"));
        holder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "您点击了我"+position, Toast.LENGTH_SHORT).show();
            }
        });

        //千万不要忘了 把convertView返回
        return convertView;
    }
    class ViewHolder{
        //有哪些控件,根据单条布局来定
        //Button TextView
        Button  button;
        TextView textView;
    }

                

             

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