Listview的适配器封装

本文介绍了一种自定义适配器方法,通过封装ViewHolder,简化了ListView适配器的编写,减少了重复代码,提高了效率。

               ListView的适配器相信大家都写过太多遍了,继承BaseAdapter抽象类,重写getCount,getItem,getItemId,getView方法。为了让汽配器提高效率还要

使用ViewHolder存储convertView中的控件。其大多代码都是重复的,只有一小部分代码是不一样的。因此我么可以封装一下,就不用在写那些冗余的代码了!

自定义的ViewHolder:

package com.example.getmynumber.adapter;

import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ViewHolder {
	//承载ItemView中各个控件的容器,类似于Map,不过其键值只能是Integer类型
	private SparseArray<View> mViews;
	private View convertView;

	public ViewHolder(Context context, int position, ViewGroup parent, int itemLayoutId) {
		mViews = new SparseArray<View>();
		// 为viewHolder绑定到convertView
		convertView = LayoutInflater.from(context).inflate(itemLayoutId, parent, false);
		convertView.setTag(this);
	}

	/**
	 * 拿到一个ViewHolder对象
	 * 
	 * @param context
	 * @param convertView
	 * @param parent
	 * @param itemLayoutId
	 * @param position
	 * @return
	 */
	public static ViewHolder getViewHolder(Context context, int position, View convertView,
			ViewGroup parent, int itemLayoutId) {
		if (convertView == null) {
			return new ViewHolder(context, position, parent, itemLayoutId);
		} else {
			return (ViewHolder) convertView.getTag();
		}
	}

	/**
	 * 根据控件id获得控件
	 * 方法泛型
	 * @param viewId
	 * @return
	 */
	public <T extends View> T getView(int viewId) {
		View view = mViews.get(viewId);
		if (view == null) {
			view = convertView.findViewById(viewId);
			mViews.put(viewId, view);
		}
		return (T) view;
	}

	/**
	 * 获得convertView;
	 * @return
	 */
	public View getConvertView() {
		return convertView;
	}

}

自定义BaseListAdapter:

package com.example.getmynumber.adapter;

import java.util.ArrayList;

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

public abstract class BaseListAdapter<T> extends BaseAdapter {

	private Context context;
	private LayoutInflater mInflater;
	private ArrayList<T> mValues;
	private int itemLayoutId;

	public BaseListAdapter(Context context, ArrayList<T> mValues, int itemLayoutId) {

		this.context = context;
		// item布局id
		this.itemLayoutId = itemLayoutId;
		if (mValues == null) {
			this.mValues = new ArrayList<T>();
		} else {
			this.mValues = mValues;
		}
		mInflater = LayoutInflater.from(context);
	}

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

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

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder helper = ViewHolder.getViewHolder(context, position, convertView, parent,
				itemLayoutId);
		convert(helper, mValues.get(position));
		return helper.getConvertView();
	}

	// 需要重写的唯一方法
	public abstract void convert(ViewHolder helper, T item);

}

使用方法:

myAdapter=new BaseListAdapter<String>(CustomListViewActivity.this, citys, R.layout.ll_item) {

			@Override
			public void convert(ViewHolder helper, String item) {
				TextView tv_item=helper.getView(R.id.tv_item);
				tv_item.setText(item);
			}
		};

只要重写一个方法是不是简单多了!






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值