在设计listView显示的时候我们都希望列表在滑动的时候能够顺畅,不会出现卡死的情况,或是加载很慢的情况;在listView显示中convertView(静态View)避免了每次都去创建新的view,只要复用原有的convertView就可以了,从而达到优化的效果;
今天我们主要讲的是和convertView一起应用的ViewHolder;
1、先看如下代码:
public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = View.inflate(mContext, R.layout.item_contact_label_name, null); holder.tagName = (TextView)convertView.findViewById(R.id.tv_contact_tag_name); convertView.setTag(holder); } else { holder = (ViewHolder)convertView.getTag(); } TNPFriendTag tagItem = getItem(position); holder.tagName.setText(tagItem.getTagName()); return convertView; } private class ViewHolder { TextView tagName; }上面代码是我们最常见的,adapter里面要显示的字段在ViewHolder中定义全局变量,在getView(。。。)里面用到就以 holder. tagName来用;
在初始化时用代码holder.tagName = (TextView)convertView.findViewById(R.id.tv_contact_tag_name);
2、下面我们来说下另一种写法,我们把ViewHolder进行重写,代码如下:
public class ViewHolder { /** * 一般listView * * @param view view * @param id id * @return T 返回类型 */ @SuppressWarnings("unchecked") public static <T extends View> T get(View view, int id) { SparseArray<View> viewHolder = (SparseArray<View>)view.getTag(); if (viewHolder == null) { viewHolder = new SparseArray<>(); view.setTag(viewHolder); } View childView = viewHolder.get(id); if (childView == null) { childView = view.findViewById(id); viewHolder.put(id, childView); } return (T)childView; } }那么我们在getView里面初始化属性时就用
TextView title = ViewHolder.get(convertView, R.id.tv_insterest_category);
具体代码在下面贴出:
@Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = View.inflate(context, R.layout.item_property_insterest, null); } TextView title = ViewHolder.get(convertView, R.id.tv_insterest_category); TNPInterest insterestBean = dataList.get(position); title.setText(insterestBean.getName()); showInsterest(insterestBean, title); return convertView; }
总结: