convertview与viewholder
2015-07-10 15:46
197 查看
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());
.......
}
前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());
.......
}
相关文章推荐
- Some projects cannot be imported because they already exist in the workspace
- nginx----ngx_buf
- Android_开源控件_DragSortListview
- 控件:可见、隐身、走开
- 异或(XOR)在算法中的一些适用情况
- 一天一总结 7.10
- [转]Mac常用软件推荐
- GRE写作必备句型
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- Linux驱动程序-----字符设备
- SQLServer: 如何搜索%、_、[
- Images.xcassets 的简单使用
- [Phonegap+Sencha Touch] 移动开发56 安卓要注意不同CPU指令集的第三方.so库文件的引用
- HTML页脚无论内容怎么变都在网页的最底部
- jquery删除数组指定元素
- CodeIgniter学习笔记(十二)——CI中的路由
- 大话——2015年7月10日,直播学编程!
- 删除表最快
- Timer和TimerTask
- 一键切换jdk