在写安卓的适配器中,使用内部类ViewHolder的形式进行优化时,每次都要写很多代码是很枯燥的一件事。下面的写法将大大减少代码的重复书写:
import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* 封装的ViewHolder工具类。用于Adapter的getView方法中
*/
public class AdapterHolder {
// private final HashMap<Integer,View> mViews;
private final SparseArray<View> holder;
private View convertView;
private AdapterHolder(Context context,View convertView, ViewGroup parent, int layoutId,int position) {
convertView = LayoutInflater.from(context).inflate(layoutId, parent,false);
holder = new SparseArray<View>();
convertView.setTag(this);
this.convertView = convertView;
}
public static AdapterHolder getHolder(Context context, View convertView,ViewGroup parent, int layoutId, int position) {
if (convertView == null) {
return new AdapterHolder(context, convertView, parent, layoutId, position);
}
return (AdapterHolder) convertView.getTag();
}
public View getConvertView(){
return convertView;
}
@SuppressWarnings("unchecked")
public <T> T getView(int id) {
View childView = (View) holder.get(id);
if (childView == null) {
childView = convertView.findViewById(id);
holder.put(id, childView);
}
return (T) childView;
}
// public static <T>T getView(View converrView,int id){
// if (holder == null) {
// holder = new SparseArray<View>();
// }
// View childView = (View) holder.get(id);
// if (childView == null) {
// childView = convertView.findViewById(id);
// holder.put(id, childView);
// }
// return (T) childView;
// }
}
使用方式:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
AdapterHolder adapterHolder = AdapterHolder.getHolder(context, convertView, parent, R.layout.item_linearlayout_other_activity, position);
ItemInfo itemInfo = itemInfos.get(position);
TextView tv_mess = adapterHolder.getView(R.id.tv_text_linearLayout);
ImageView iv_icon = adapterHolder.getView(R.id.iv_icon_linearLayout);
tv_mess.setText(itemInfo.getStringId());
iv_icon.setBackgroundResource(itemInfo.getImageId());
return adapterHolder.getConvertView();
}