Android万能适配器(一)封装ViewHolder

封装ViewHolder


首先介绍下ViewHolder

正常开发中ViewHolder并不是必须的,可以说使用ViewHolder一般会让开发更加复杂,但是为什么我们还是要使用ViewHolder,原因很简单ViewHolder会提供程序运行效率,在不用ViewHolder的时候,每次调用getView方法,都会通过findViewById查找布局里的控件,这个是比较耗费时间的,使用ViewHolder可以把控件存储到ViewHolder里面,在使用时候直接从ViewHolder取就ok。这样能提高程序效率。

 简单使用ViewHolder 

ViewHolder使用非常简单,一般在Adapter内部定义一个ViewHolder类,本章使用单个TextView作为demo。

/**
 * 定义ViewHolder类
 * @author IsCoding
 */
private final class ViewHolder {
	TextView mTextView;
}

这样就实现了一个简单的 ViewHolder,不过这样有个问题就是每个Adapter都需要自定义一个ViewHolder类,写起来非常麻烦

封装 ViewHolder

简单分析ViewHolder封装。ViewHolder内部正常是保存每个页面控件的索引,那么封装时候我们可以使用容器把每个Item布局中的所有控件存储到这个容器里面,每次使用时候从容易查询.这里用Map可以实现。也可以使用SparseArray替换,SparseArray比Map效率更高。

/**
 * 封装ViewHolder工具类
 * @author IsCoding
 */
public class ViewHolder {
	private final HashMap<Integer,View> mViews;
	private View mConvertView;
	public ViewHolder(Context context, ViewGroup parent, int layoutId,
			int position) {
		this.mViews = new HashMap<Integer,View>();
		mViews.clear();
		mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,
				false);
		mConvertView.setTag(this);
	}
	public static ViewHolder get(Context context, View convertView,
			ViewGroup parent, int layoutId, int position) {
		if (convertView == null) {
			return new ViewHolder(context, parent, layoutId, position);
		}
		return (ViewHolder) convertView.getTag();
	}
 
	public <T extends View> T getView(int viewId) {

		View view = mViews.get(viewId);
		if (view == null) {
			view = mConvertView.findViewById(viewId);<pre name="code" class="java">

 
  

下面看一下使用封装后的ViewHolder 的效果

package com.iscoding.mobile.adaptertest.test2.adapter;

import java.util.List;

import com.iscoding.mobile.adaptertest.R;
import com.iscoding.mobile.adaptertest.test2.ViewHolder;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyAdapter2 extends BaseAdapter {
	private LayoutInflater mInflater;
	private Context mContext;
	private List<String> mDatas;

	public MyAdapter2(Context context, List<String> mDatas) {
		mInflater = LayoutInflater.from(context);
		this.mContext = context;
		this.mDatas = mDatas;
	}

	@Override
	public int getCount() {
		return mDatas.size();
	}

	@Override
	public Object getItem(int position) {
		return mDatas.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// 实例化一个viewHolder
		ViewHolder viewHolder = ViewHolder.get(mContext, convertView, parent,
				R.layout.item_1, position);
		// 通过getView获取控件
		TextView tv = viewHolder.getView(R.id.text_title);
		// 使用
		tv.setText(mDatas.get(position));
		return viewHolder.getConvertView();
	}
}


使用封装好的 ViewHolder  已经使代码看起来简洁非常多了。





 

你可能感兴趣的:(Android万能适配器(一)封装ViewHolder)