安卓Adapter适配器Hodler封装

原创
2016/10/11 20:10
阅读数 184

在写安卓的适配器中,使用内部类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();
	}

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部