在我们使用Adapter 的时候,总是不断的写类似建立个ViewHolder 类,然后通过getTag 的方式去获取,感觉这种写法总有改进的地方,目前在项目中有个改进的方法,抽象出工具类来,
public static <T extends View> T requestView(View convertView, int id) { SparseArray<View> viewHolder = (SparseArray<View>) convertView.getTag(); if (viewHolder == null) { viewHolder = new SparseArray<View>(); convertView.setTag(viewHolder); } View view = viewHolder.get(id); if (view == null) { view = convertView.findViewById(id); viewHolder.put(id, view); } return (T) view; }
在代码中这样使用:
if (convertView == null) { convertView = mInflater.inflate(R.layout.user_action_item_layout, parent, false); } TextView remarkTitle = HotelViewHolder.requestView(convertView, R.id.order_user_action_title); ImageView imageViewIcon = HotelViewHolder.requestView(convertView, R.id.user_action_lottery_icon); LinearLayout userActionLinearLayout = HotelViewHolder.requestView(convertView, R.id.user_action_layout);
相对比以前的写法:
@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { convertView = mInflater.inflate(mLayoutResource, parent, false); viewHolder = new ViewHolder(convertView); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); }
private static class ViewHolder { private TextView mTitleText; private TextView mDescriptionText; private ImageView mImage; public ViewHolder(View view) { mTitleText = (TextView) view.findViewById(R.id.title_text); mDescriptionText = (TextView) view.findViewById(R.id.description_text); mImage = (ImageView) view.findViewById(R.id.image); } }
明显简洁很多,推荐这种写法!