Android中的Adapter封装

转载请注明出处:http://blog.youkuaiyun.com/zhanjixun/article/details/51346305

 

在Android开发中经常会用到Adapter,经常要实现一大堆方法。为了简化开发,不多做一些简单繁琐的工作,我对Adapter进行了封装。

 

/**
 * 要先在构造函数中调用setLayoutId()设置布局文件
 * 
 * @author zhanjixun
 *
 * @param <T>
 */
public abstract class EasyAdapter<T> extends BaseAdapter {

	protected List<T> mList = new LinkedList<T>();
	protected Context mContext;
	protected int mLayoutId;

	public EasyAdapter(Context context, List<T> list) {
		mContext = context;
		mList = list;
	}

	/**
	 * 获取适配器的数据
	 * 
	 * @return
	 */
	public List<T> getList() {
		return mList;
	}

	/**
	 * 单个添加数据
	 * 
	 * @param item
	 */
	public void add(T item) {
		mList.add(item);
		notifyDataSetChanged();
	}

	/**
	 * 追加数据
	 * 
	 * @param list
	 */
	public void append(List<T> list) {
		mList.addAll(list);
		notifyDataSetChanged();
	}

	/**
	 * 替换数据,不关联参数的List
	 * 
	 * @param list
	 */
	public void replace(List<T> list) {
		mList.clear();
		mList.addAll(list);
		notifyDataSetChanged();
	}

	/**
	 * 清空数据
	 */
	public void clear() {
		mList.clear();
		notifyDataSetChanged();
	}

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

	@Override
	public T getItem(int position) {
		return mList.get(position);
	}

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

	public Context getContext() {
		return mContext;
	}

	public int getLayoutId() {
		return mLayoutId;
	}

	protected void setLayoutId(int layoutId) {
		mLayoutId = layoutId;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {

		ViewHolder holder = null;

		if (convertView == null) {
			View view = convertView = View.inflate(mContext, mLayoutId, null);
			holder = new ViewHolder(view);
			view.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		// 填充信息
		convert(position, holder, getItem(position));

		return holder.getConvertView();
	}

	protected abstract void convert(int position, ViewHolder holder, T item);

}

其中用到的ViewHolder是用来保存重用的view的,可以在这里设置特定的item的数据

 

代码如下:(其中除了一大堆常用的view的api之外,关键代码在前面几个方法,构造函数ViewHolder(View)通过传入一个View来持有这个View,findViewById,通过id定位子控件)

 

/**
 * view持有
 * 
 * @author zhanjixun
 *
 */
public class ViewHolder {

	private final SparseArray<View> mViews = new SparseArray<View>();

	private View mConvertView;

	public ViewHolder(View v) {
		mConvertView = v;
	}

	/**
	 * 通过viewId获取控件
	 * 
	 * @param viewId
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public <T extends View> T findViewById(int viewId) {
		View view = mViews.get(viewId);
		if (view == null) {
			view = mConvertView.findViewById(viewId);
			mViews.put(viewId, view);
		}
		return (T) view;
	}

	/**
	 * 得到持有的View
	 * 
	 * @return
	 */
	public View getConvertView() {
		return mConvertView;
	}

	public ViewHolder setText(int viewId, String text) {
		TextView tv = findViewById(viewId);
		tv.setText(text);
		return this;
	}

	public ViewHolder setImageResource(int viewId, int resId) {
		ImageView view = findViewById(viewId);
		view.setImageResource(resId);
		return this;
	}

	public ViewHolder setImageBitmap(int viewId, Bitmap bitmap) {
		ImageView view = findViewById(viewId);
		view.setImageBitmap(bitmap);
		return this;
	}

	public ViewHolder setImageDrawable(int viewId, Drawable drawable) {
		ImageView view = findViewById(viewId);
		view.setImageDrawable(drawable);
		return this;
	}

	public ViewHolder setBackgroundColor(int viewId, int color) {
		View view = findViewById(viewId);
		view.setBackgroundColor(color);
		return this;
	}

	public ViewHolder setBackgroundResource(int viewId, int backgroundRes) {
		View view = findViewById(viewId);
		view.setBackgroundResource(backgroundRes);
		return this;
	}

	public ViewHolder setTextColor(int viewId, int textColor) {
		TextView view = findViewById(viewId);
		view.setTextColor(textColor);
		return this;
	}

	public ViewHolder setTextColorResource(int viewId, int textColorRes) {
		TextView view = findViewById(viewId);
		Resources resources = mConvertView.getContext().getResources();
		view.setTextColor(resources.getColor(textColorRes));
		return this;
	}

	public ViewHolder setVisibility(int viewId, int visible) {
		View view = findViewById(viewId);
		view.setVisibility(visible);
		return this;
	}

	public ViewHolder setProgress(int viewId, int progress) {
		ProgressBar view = findViewById(viewId);
		view.setProgress(progress);
		return this;
	}

	public ViewHolder setProgress(int viewId, int progress, int max) {
		ProgressBar view = findViewById(viewId);
		view.setMax(max);
		view.setProgress(progress);
		return this;
	}

	public ViewHolder setProgressMax(int viewId, int max) {
		ProgressBar view = findViewById(viewId);
		view.setMax(max);
		return this;
	}

	public ViewHolder setRating(int viewId, float rating) {
		RatingBar view = findViewById(viewId);
		view.setRating(rating);
		return this;
	}

	public ViewHolder setRating(int viewId, float rating, int max) {
		RatingBar view = findViewById(viewId);
		view.setMax(max);
		view.setRating(rating);
		return this;
	}

	public ViewHolder setTag(int viewId, Object tag) {
		View view = findViewById(viewId);
		view.setTag(tag);
		return this;
	}

	public ViewHolder setTag(int viewId, int key, Object tag) {
		View view = findViewById(viewId);
		view.setTag(key, tag);
		return this;
	}

	public ViewHolder setChecked(int viewId, boolean checked) {
		Checkable view = (Checkable) findViewById(viewId);
		view.setChecked(checked);
		return this;
	}

	public ViewHolder setOnClickListener(int viewId,
			View.OnClickListener listener) {
		View view = findViewById(viewId);
		view.setOnClickListener(listener);
		return this;
	}

	public ViewHolder setOnTouchListener(int viewId,
			View.OnTouchListener listener) {
		View view = findViewById(viewId);
		view.setOnTouchListener(listener);
		return this;
	}

	public ViewHolder setOnLongClickListener(int viewId,
			View.OnLongClickListener listener) {
		View view = findViewById(viewId);
		view.setOnLongClickListener(listener);
		return this;
	}
}

 


使用方法:

 

 

写一个类直接继承EasyAdapter声明的泛型为你要处理的数据的类型,然后实现convert方法处理数据的绑定

 

public class ListViewAdapter extends EasyAdapter<String> {

	public ListViewAdapter(Context context, List<String> list) {
		super(context, list);
		setLayoutId(R.layout.item_listview);
	}

	@Override
	public void convert(int position, ViewHolder holder, String item) {
		super.convert(position, holder, item);
		holder.setText(R.id.mainTextView, item);
	}

}

 

 

 

源代码:因为基本上的代码都在上面了,看懂的都能直接用了,这里就不提供项目代码了
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值