您的位置:首页 > 其它

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

.......

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: