关闭

convertview与viewholder

219人阅读 评论(0) 收藏 举报
分类:

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());

.......

}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:383272次
    • 积分:6238
    • 等级:
    • 排名:第3953名
    • 原创:265篇
    • 转载:505篇
    • 译文:0篇
    • 评论:12条
    最新评论