天天看點

Android 自定義BaseAdapter

基本每個項目中都要用到ListView、GridView, 而如果直接使用BaseAdapter,代碼量會非常多,是以寫了一個封裝的Adapter,大大的節省代碼量

代碼中已經加了注釋,這裡直接貼出代碼:

public abstract class ListItemAdapter<T> extends BaseAdapter {
	protected Context context;
	protected List<T> myList;

	public ListItemAdapter(Context context) {
		this.context = context;
	}

	/**
	 * 得到擴充卡所有資料
	 * 
	 * @return
	 */
	public List<T> getList() {
		return myList;
	}

	/**
	 * 為擴充卡重新整理資料。并且重新喚醒擴充卡
	 * 
	 * @param list
	 */
	public void setList(List<T> list) {
		this.myList = list;
		notifyDataSetChanged();
	}

	/**
	 * 為擴充卡添加一個List<T>的全部資料。并且重新喚醒擴充卡
	 * 
	 * @param list
	 */
	public void addList(List<T> list) {
		if (myList == null) {
			myList = new ArrayList<T>();
		}
		myList.addAll(list);// 此方法是将傳進來的List<T>全部資料條目添加到myList<T>中
		notifyDataSetChanged();
	}

	/**
	 * 為擴充卡添加一個泛型條目T
	 * 
	 * @param t
	 */
	public void addItem(T t) {
		if (myList == null) {
			myList = new ArrayList<T>();
		}
		myList.add(t);
		notifyDataSetChanged();
	}

	/**
	 * 為擴充卡删除一個泛型條目T
	 * 
	 * @param t
	 */
	public void deleteItem(int position) {
		if (myList != null) {
			myList.remove(position);
			notifyDataSetChanged();
		} else {
			// 删除失敗 擴充卡為空
		}

	}

	/**
	 * 為擴充卡添加一個泛型條目T
	 * 
	 * @param t
	 */
	public void changeItem(T t, int index) {
		if (myList == null) {
			myList = new ArrayList<T>();
		}
		myList.set(index, t);
		notifyDataSetChanged();
	}

	/**
	 * 判斷擴充卡資料是否為空
	 * 
	 * @return
	 */
	public Boolean isNull() {
		return myList == null || myList.size() == 0;
	}

	@Override
	public int getCount() {
		return null == myList ? 0 : myList.size();
	}

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

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

	public abstract View getView(int position, View convertView,
			ViewGroup parent);

}
           

使用的時候也是非常友善:

1.初始化ListView

ListView listView = (ListView) findViewById(R.id.lv);
           

2.初始化擴充卡

MyAdapter adapter = new MyAdapter(this);
           

3.綁定擴充卡

listView.setAdapter(adapter);
           

4.給擴充卡設定資料

adapter.setList(list);
           

然後MyAdapter隻需要繼承自定義的Adapter:

class MyAdapter extends ListItemAdapter<String>{

		public Test(Context context) {
			super(context);
			// TODO Auto-generated constructor stub
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			return null;
		}
	
	}
           

附完整Demo:

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

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

	private ListView listView;
	private MyAdapter adapter;
	private List<Bean> list = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		listView = (ListView) findViewById(R.id.lv);// 初始化ListView
		adapter = new MyAdapter(this);
		listView.setAdapter(adapter);// 綁定擴充卡
		list = new ArrayList<Bean>();
		for (int i = 0; i < 30; i++) {
			Bean bean = new Bean();
			bean.setName("是道德的淪喪還是人性的泯滅");
			list.add(bean);
		}
		adapter.setList(list);// 給Adapter設定資料
	}

	class MyAdapter extends ListItemAdapter<Bean> {

		public MyAdapter(Context context) {
			super(context);
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			Holder holder = null;
			if (convertView == null) {
				holder = new Holder();
				convertView = View.inflate(context, R.layout.item, null);
				holder.tv = (TextView) convertView.findViewById(R.id.tv);
				convertView.setTag(holder);
			} else {
				holder = (Holder) convertView.getTag();
			}

			final Bean bean = myList.get(position);

			holder.tv.setText(bean.getName());

			return convertView;
		}

		class Holder {
			TextView tv;
		}
	}

	class Bean {
		String name;

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

	}

}
           

最後再補充一下,如果需要做分頁,第一頁的資料直接adapter.setList(lsit);   第二頁以後的資料直接adapter.addList(list);

下載下傳位址:http://download.csdn.net/detail/qq_18612815/9518827



繼續閱讀