convertview与viewholder

原创 2015年07月10日 15:46:59

convertview是指在recycler构件中的view。

前7个view的形成过程

android的listView在初始化的时候,如果整个屏幕只能放下7个item,那么就会只会inflate7个view,创建7个viewholder。也就是说

 if (convertView == null) {
                 convertView = mInflater.inflate(R.layout.item,null);
                  holder = new ViewHolder();//convertView下的三个控件ItemTitle、ItemText、ItemButton交由 holder管理,
                                                             // 即holder对象hold着这三个控件,一个convertview对应一个viewholder
                                    
                   holder.title = (TextView) convertView.findViewById(R.id.ItemTitle);
                    holder.text = (TextView) convertView.findViewById(R.id.ItemText);
                    holder.bt = (Button) convertView.findViewById(R.id.ItemButton);
                    convertView.setTag(holder);//绑定ViewHolder对象       
                    
                   }

这个if语句块只会执行7次。

然后经以下语句给convertview里的组件设置内容

holder.title.setText(getData().get(position).get("ItemTitle").toString());

 holder.text.setText(getData().get(position).get("ItemText").toString());
  最后  这前7个view(convertview)功德圆满,有型有值,可以return convertview了。     

以后的view的形成过程

当第一个view滑出屏幕时,这个view就会落到recycler中,这时convertview就不再等于null了,而是这个view了,只可惜,每一个落到recycler中的view都会剥离掉它的值,只剩下它的型。也就是说落到recycler中的view仍然绑定了ViewHolder对象,但是convertview里的组件的内容已经不复存在了,需要重新设置。所以会执行以下语句。

holder = (ViewHolder)convertView.getTag();

holder.title.setText(getData().get(position).get("ItemTitle").toString());
holder.text.setText(getData().get(position).get("ItemText").toString());


所以将这两个形成过程结合起来,就是:

 public View getView(final int position, View convertView, ViewGroup parent) {
       
 ViewHolder holder;

 if (convertView == null) {
                     convertView = mInflater.inflate(R.layout.item,null);
                     holder = new ViewHolder();/
                                    
                    holder.title = (TextView) convertView.findViewById(R.id.ItemTitle);
                    holder.text = (TextView) convertView.findViewById(R.id.ItemText);
                    holder.bt = (Button) convertView.findViewById(R.id.ItemButton);
                    convertView.setTag(holder);//绑定ViewHolder对象       
                    
                   }

else{

                    holder = (ViewHolder)convertView.getTag();

                   }

holder.title.setText(getData().get(position).get("ItemTitle").toString());
holder.text.setText(getData().get(position).get("ItemText").toString());

.......

}

注:不用if和else语句不会在界面上有什么改变,只是会增大内存花销,因为不使用recycler中的convertview,而去自己创建,每一个列表项都要inflate一个view,创建一个viewholder

以下是不用if和else语句的代码

 public View getView(final int position, View convertView, ViewGroup parent) {
       
                   ViewHolder holder;

                   convertView = mInflater.inflate(R.layout.item,null);
                     holder = new ViewHolder();/
                                    
                    holder.title = (TextView) convertView.findViewById(R.id.ItemTitle);
                    holder.text = (TextView) convertView.findViewById(R.id.ItemText);
                    holder.bt = (Button) convertView.findViewById(R.id.ItemButton);
                    convertView.setTag(holder);//绑定ViewHolder对象   
            

                    

holder.title.setText(getData().get(position).get("ItemTitle").toString());
holder.text.setText(getData().get(position).get("ItemText").toString());

.......

}



安卓开发,listview的优化,减少内存消耗,复用convertView、ViewHolder和分页加载

1:复用convertView,可以减少view对象的创建。adapter中的getview()方法会传经来一个convertView,convertView是指曾经使用过的view对象,可以被重复使...

ListView中ConvertView和ViewHolder

ListView中ConvertView和ViewHolder

ListView中convertview和ViewHolder的区别

LsitView和Adapter 参考:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html 工作原理:  1.Lis...

ListView(优化),自定义Layout和adapter,entity,ViewHolder,ConvertView用法案例(phone)

自定义实体类:PhoneEntity.javapackage com.example.entity;/** * Created by Administrator on 2017/2/16. */p...

ListView中convertView和ViewHolder的工作原理

LsitView和Adapter参考: http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html 工作原理: 1.Lis...

convertView优化ListView性能 ViewHolder中介 Github 简明入门指南思维导图

这里提到的ListView只是作为一个典型代表 其实在Android中 采用类似Adapter机制的GridView等都是可以适用的 而ListView应该是用得最多的 所以就以它来举例 大家都知道...

ListView性能优化之convertView和ViewHolder

最近碰到的面试题中经常会碰到问"ListView的优化"问题。所以就拿自己之前写的微博客户端的程序做下优化。 自己查了些资料,看了别人写的博客,得出结论,ListView优化大致从以下几个角度: ...

探秘ListView的ConvertView以及ViewHolder原理

转自:http://zhiweiofli.iteye.com/blog/1269746 最近在使用android的组件ExpandableListView,实现需求时,遇到不少奇怪的问题。 ...
  • cc_lq
  • cc_lq
  • 2011年12月21日 09:04
  • 1559

Adapter优化(一)convertView和ViewHolder机制

一、初步 像ListView、GridView这些组件通常需要使用setAdapter方法传入一个适配器,这个Adapter的作用,初步理解就是把一个xml形式的item返回成View给组件吧(理论...

浅谈ListView之convertView和viewHolder

最近开发相册时,碰到缩略图现实的问题,功能实现后发现滚动时比较的卡顿, 先就ListView优化问题提出几点看法: 1、复用已经生成的convertView; 2、添加viewHolder类; 3、缓...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:convertview与viewholder
举报原因:
原因补充:

(最多只允许输入30个字)