在使用ViewHolder的时候遇到一个令人难忘的问题,在此记录,以备后用!!
先说下我当时的那个界面,主体是一个PullToRefreshListView(一个下拉刷新的列表),每个列表项显示一个用户的一些信息,包括:头像,昵称,和’0~N’个技能项,每个技能项用一个TextView显示,最多显示用户的三条技能项,不足三条的技能项只显示其实际的技能,剩下的TextView设置为不可见。
问题来了:刷新一次后,有的用户的技能项变少了,在刷新一次,干脆就没了!!
在洋神的指导下,找到了问题的所在:
代码:final ViewHolder viewHolder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.my_liked_list_item, null);
viewHolder = new ViewHolder();
viewHolder.iv_user_img = (CircleImageView) convertView.findViewById(R.id.iv_user_img);
viewHolder.tv_ilike_nick = (TextView) convertView.findViewById(R.id.ilike_nick);
viewHolder.tv_ilike_skills1 = (TextView) convertView.findViewById(R.id.ilike_skills1);
viewHolder.tv_ilike_skills2 = (TextView) convertView.findViewById(R.id.ilike_skills2);
viewHolder.tv_ilike_skills3 = (TextView) convertView.findViewById(R.id.ilike_skills3);
viewHolder.tv_skills_tail = (TextView) convertView.findViewById(R.id.ilike_skills_tail);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
ViewHolder使用原理很简单就是第一此使用XML中布局控件的时候,要在索引文件R.java中找一次,是一个很浪费时间的操作,ViewHolder在第一次的时候就将这些控件的索引保存起来。
在View类中定义有一个protected Object mTag = null;
public void setTag(final Object tag) {
mTag = tag;
}
public Object getTag() {
return mTag;
}
我的理解是View类通过一个Object对象保存了所有控件的索引,当页面进行刷新的时候,页面使用的仍然是上一次调用的控件对象,因为第一次使用的时候设置了这些控件对象的属性,在第二次使用的时候这些控件的属性仍然保留了下来