1. 程式人生 > >Android中ListView、GridView的通用適配封裝簡化程式碼

Android中ListView、GridView的通用適配封裝簡化程式碼

轉載請註明出處:http://blog.csdn.net/u013038616/article/details/50733935


ListView和GridView是我們平時經常用來展示集合資料,每次都要為每種列表建一個專門的適配,雖然建立介面卡灰常簡單,但是每次都會有很多類似的程式碼,作為人類中最懶的程式“猿”,你能忍受這種重複的操作麼?不管你能忍不能忍,反正我是不忍了。於是今天的主角通用適配就誕生了-------CommonBaseAdapter。


在平時的介面卡編寫中,變化最大就是View的查詢與內容繫結的部分,而CommonBaseAdapter巧妙的通過ViewHolder將View的查詢與繫結內容轉移到了onConvert這個抽象方法中,將多變的部分交給具體的子類去實現,而自己去實現介面卡中基本固定的邏輯與方法。當子類去實現一個具體的介面卡類時候只需要關心具體的資料繫結部分即可。


CommonBaseAdapter的優點:

a、操作簡單,簡化了介面卡的建立過程,將任務的重心轉移到View與內容展示上,提高了工作效率。

b、資料來源廣,通過泛型指定對應的資料類別,提高了介面卡的使用範圍。

c、效率高,內部採用ViewHoler的形式複用列表條目提高效率。

該類實現非常簡單,可以根據不同需要進行原始碼修改即可,是不是感覺棒棒噠!


閒言少敘,直接上程式碼,相信她一定是人見人愛!

import java.util.List;

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

public abstract class CommonBaseAdapter<T> extends BaseAdapter {

	protected List<T> mList;
	protected Context mContext;
	protected int mLayoutId;

	/**
	 * 
	 * @param context
	 *            上下文物件
	 * @param list
	 *            資料集合
	 * @param layoutId
	 *            佈局檔案
	 */
	public CommonBaseAdapter(Context context, List<T> list, int layoutId) {
		this.mList = list;
		this.mContext = context;
		this.mLayoutId = layoutId;
	}

	/**
	 * 得到內部資料集合
	 * 
	 * @return
	 */
	public List<T> getList() {
		return mList;
	}

	@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;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder holder;
		if (convertView == null) {
			holder = new ViewHolder(mContext, parent, mLayoutId);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}

		T bean = mList.get(position);
		onConvert(holder, bean, position);
		return holder.getConvertView();
	}

	/**
	 * 設定條目中控制元件顯示的資訊
	 * 
	 * @param holder
	 *            封裝adapter中item的複用操作程式碼的物件
	 * @param bean
	 *            資料Bean
	 * @param position
	 *            當前條目位置
	 */
	public abstract void onConvert(ViewHolder holder, T bean, int position);

	/**
	 * ConnomAdapter的內部類,封裝adapter中item的複用操作程式碼<br>
	 * 使用方法:<br>
	 * 1、通過ViewHolder.getInstance(...)方法傳入必要的引數得到ViewHolder物件<br>
	 * ,該過程已被封裝到ConnomAdapter的內部<br>
	 * 2、通過ViewHolder物件的方法getView(...)傳入View的id得到對應控制元件<br>
	 * 3、通過ViewHolder物件的方法getConvertView()得到條目複用物件convertView<br>
	 * ,該過程已被封裝到ConnomAdapter的內部<br>
	 */
	public static class ViewHolder {
		private SparseArray<View> mViewsSparseArray;
		private View convertView;

		public ViewHolder(Context context, ViewGroup parent, int layoutResId) {
			mViewsSparseArray = new SparseArray<View>();
			convertView = LayoutInflater.from(context).inflate(layoutResId, parent, false);
			convertView.setTag(this);
		}

		/**
		 * 得到對應Id的佈局控制元件
		 * 
		 * @param viewId
		 *            控制元件Id
		 * @return 控制元件T extends View
		 */
		@SuppressWarnings("unchecked")
		public <T extends View> T getView(int viewId) {

			View view = mViewsSparseArray.get(viewId);
			if (view == null) {
				view = convertView.findViewById(viewId);
				mViewsSparseArray.put(viewId, view);
			}
			return (T) view;
		}

		/**
		 * 得到條目複用物件
		 * 
		 * @return convertView
		 */
		public View getConvertView() {
			return convertView;
		}

		/**
		 * 設定TextView的內容
		 * 
		 * @param viewId
		 *            TextView的id
		 * @param text
		 *            TextView的內容
		 * @return ViewHolder自己實現鏈式程式設計
		 */
		public ViewHolder setText(int viewId, String text) {
			TextView textView = getView(viewId);
			textView.setText(text);
			return this;
		}

	}

}




簡單演示下如何使用CommonBaseAdapter類:

此處只列出Bean和適配其餘部分自行腦補。

Bean:

public class Person {
	private String name;
	private int age;

	public Person() {

	}

	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}


介面卡:

import java.util.List;

import com.example.test.R;

import android.content.Context;
import android.widget.TextView;

public class PersonAdapter extends CommonBaseAdapter<Person> {

	public PersonAdapter(Context context, List<Person> list, int layoutId) {
		super(context, list, layoutId);
	}

	@Override
	public void onConvert(ViewHolder holder, Person bean, int position) {
		TextView name = holder.getView(R.id.name);
		TextView age = holder.getView(R.id.age);

		name.setText(bean.getName());
		age.setText(bean.getAge());
	}

}