適配器基類--萬能適配器(BaseAdapter)

一個抽象類繼承BaseAdapter


package com.lei.adapter;

import java.util.ArrayList;
import java.util.List;

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

public abstract class MyBaseAdapter<T> extends android.widget.BaseAdapter {
	private List<T> data = new ArrayList<T>();
	private Context context;
	private int layoutId;

	public MyBaseAdapter(Context context, int layoutId, List<T> datas) {
		this(context, layoutId);
		this.data = datas;
	}

	public MyBaseAdapter(Context context, int layoutId) {
		this.context = context;
		this.layoutId = layoutId;
	}

	public int getCount() {
		return data.size();
	}

	public T getItem(int position) {
		return data.get(position);
	}

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

	public View getView(int position, View convertView, ViewGroup parent) {
		
		ViewHolder holder = ViewHolder.newInstance(context, convertView,
				layoutId, parent, position);
		setViewDetails(holder, getItem(position));
		
		return holder.getConvertView();
	}
<span style="white-space:pre">	</span>//要實現的抽象方法,具體爲控件賦值
	public abstract void setViewDetails(ViewHolder holder, T data);
}


ViewHolder

根據自己需求,增加一些方法

package com.lei.adapter;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

public class ViewHolder {
	private View mContentView;
	private SparseArray<View> mViews;// 裝控件
	private int mPosition;
	private Context context;

	public static ViewHolder newInstance(Context context, View convertView,
			int layoutId, ViewGroup group, int position) {
		ViewHolder holder = null;
		if (convertView == null) {
			holder = new ViewHolder(context, layoutId, group, position);
		} else {
			holder = (ViewHolder) convertView.getTag();
			holder.mPosition = position;
		}
		return holder;
	}

	private ViewHolder(Context context, int layoutId, ViewGroup group,
			int position) {
		this.context = context;
		mViews = new SparseArray<View>();
		this.mPosition = position;

		mContentView = LayoutInflater.from(context).inflate(layoutId, group,
				false);
		mContentView.setTag(this);
	}

	public <T extends View> T getViewById(int resId) {
		View view = mViews.get(resId);
		if (null == view) {
			view = mContentView.findViewById(resId);
			mViews.put(resId, view);
		}
		return (T) view;
	}

	/**
	 * 爲textview設置內容
	 * 
	 * @param resId
	 * @param text
	 */
	public void setTextForTv(int resId, String text) {
		TextView tv = getViewById(resId);
		tv.setText(text);
	}

	/**
	 * 設置文字顏色
	 * 
	 * @param resId
	 * @param colorId
	 */
	public void setTextColor(int resId, int colorId) {
		TextView tv = getViewById(resId);
		tv.setTextColor(colorId);
	}

	public void setImageResource(int resId, int imgId) {
		ImageView img = getViewById(resId);
		img.setImageResource(imgId);
	}

	public void setImageBitmap(int resId, Bitmap bitmap) {
		ImageView img = getViewById(resId);
		img.setImageBitmap(bitmap);
		if (null != bitmap) {
			bitmap.recycle();
		}
	}

	public View getConvertView() {
		return mContentView;
	}

	public int getPosition() {
		return mPosition;
	}

}


下面是一個Demo

package com.lei.vpdemo;

import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

import com.lei.adapter.MyBaseAdapter;
import com.lei.adapter.ViewHolder;

public class MyListAct extends ListActivity {
	List<String> mData;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		initData();
		ListAdapter adapter = new ListAdapter(this,
				android.R.layout.simple_list_item_multiple_choice, mData);
		setListAdapter(adapter);
	}

	private void initData() {
		mData = new ArrayList<String>();
		mData.add("JAVA");
		mData.add("Android");
		mData.add("浪潮之巔");
		mData.add("瘋狂講義");
	}
<span style="white-space:pre">	</span>//adapter 實現類,只需要實現它的抽象方法和構造函數
	public class ListAdapter extends MyBaseAdapter<String> {
		Context context;

		public ListAdapter(Context context, int layoutId, List<String> datas) {
			super(context, layoutId, datas);
			this.context = context;
		}

		// 回調,爲item賦值
		@Override
		public void setViewDetails(ViewHolder holder, final String data) {
			holder.setTextForTv(android.R.id.text1, data);
			//通過個體position爲item設置個性化
			if (holder.getPosition() == 2) {
				holder.setTextColor(android.R.id.text1, Color.GREEN);
			}
			if (holder.getPosition() == 3) {
				holder.getViewById(android.R.id.text1).setOnClickListener(
						new OnClickListener() {

							public void onClick(View v) {
								Toast.makeText(context, data, Toast.LENGTH_LONG)
										.show();
							}
						});
			}
		}

	}

}

效果圖如下:









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章