package com.m.support.adapter; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import com.m.support.Inject.InjectUtility; public abstract class ABaseAdapter<T extends Serializable> extends BaseAdapter { private Context context; private ArrayList<T> datas; private int selectedPosition = -1; private BaseAdapterHelper<T> adapterHelper; public ABaseAdapter(ArrayList<T> datas, Activity context) { if (datas == null) datas = new ArrayList<T>(); this.datas = datas; this.context = context; } abstract protected AbstractItemView<T> newItemView(); public void setAdapterHelper(BaseAdapterHelper<T> adapterHepler) { this.adapterHelper = adapterHepler; } public BaseAdapterHelper<T> getAdapterHepler() { return adapterHelper; } /** * 设置position项ItemView为selected状态 * * @param position */ public void setSelected(int position) { selectedPosition = position; notifyDataSetChanged(); } public int getSelected() { return selectedPosition; } @Override public View getView(int position, View convertView, ViewGroup parent) { AbstractItemView<T> itemViewProcessor; boolean isReusing = true; if (convertView != null && adapterHelper != null) isReusing = adapterHelper.isReusing(convertView); if (convertView == null || !isReusing) { itemViewProcessor = newItemView(); convertView = View.inflate(context, itemViewProcessor.inflateViewId(), null); convertView.setTag(itemViewProcessor); itemViewProcessor.bindingView(convertView); } else { itemViewProcessor = (AbstractItemView<T>) convertView.getTag(); } itemViewProcessor.position = position; if (adapterHelper != null) itemViewProcessor.bindingData(convertView, adapterHelper.getItem(position, datas)); else itemViewProcessor.bindingData(convertView, datas.get(position)); if (adapterHelper != null) itemViewProcessor.updateConvertView(adapterHelper.getItem(position, datas), convertView, selectedPosition); else itemViewProcessor.updateConvertView(datas.get(position), convertView, selectedPosition); convertView.setSelected(selectedPosition == position); return convertView; } public ArrayList<T> getDatas() { return datas; } @Override public int getCount() { if (adapterHelper != null) return adapterHelper.getCount(datas); return datas.size(); } @Override public Object getItem(int position) { return datas.get(position); } @Override public long getItemId(int position) { return position; } public void setDatas(ArrayList<T> datas) { this.datas = datas; } public void setDatasAndRefresh(ArrayList<T> datas) { setDatas(datas); notifyDataSetChanged(); } public void addItem(T entry) { datas.add(entry); } public void addItemAndRefresh(T entry) { addItem(entry); notifyDataSetChanged(); } public void addItems(List<T> entries) { for (T entry : entries) datas.add(entry); } public void addItemsAndRefresh(List<T> entries) { addItems(entries); notifyDataSetChanged(); } public void addItem(T entry, int to) { datas.add(to, entry); } public void addItemsAndRefresh(T entry, int to) { datas.add(to, entry); notifyDataSetChanged(); } public void addItemAtFront(T entry) { datas.add(0, entry); } public void addItemAtFrontAndRefresh(T entry) { addItemAtFront(entry); notifyDataSetChanged(); } public void addItemsAtFront(List<T> entries) { for (int i = entries.size() - 1; i >= 0; i--) { datas.add(0, entries.get(i)); } } public void addItemsAtFrontAndRefresh(List<T> entries) { addItemsAtFront(entries); notifyDataSetChanged(); } public void removeItem(int index) { datas.remove(index); } public void removeItemAndRefresh(int index) { removeItem(index); notifyDataSetChanged(); } public void removeItemAndRefresh(T entry) { removeItem(entry); notifyDataSetChanged(); } public void removeItem(T entry) { datas.remove(entry); } protected void itemIsEmpty() { } public abstract static class BaseAdapterHelper<T> implements Serializable { private static final long serialVersionUID = 8411760659150853673L; abstract public int getCount(List<T> datas); abstract public T getItem(int position, List<T> datas); public boolean isReusing(View convertView) { return true; } } abstract public static class AbstractItemView<T extends Serializable> { private int position; /** * ItemView的layoutId * * @return */ abstract public int inflateViewId(); /** * 绑定ViewHolder视图 * * @param convertView */ public void bindingView(View convertView) { InjectUtility.initInjectedView(this, convertView); } /** * 绑定ViewHolder数据 * * @param data */ abstract public void bindingData(View convertView, T data); /** * 刷新当前ItemView视图 * * @param data * @param convertView * @param selectedPosition 参照{@link ABaseAdapter#setSelected(int)} */ public void updateConvertView(T data, View convertView, int selectedPosition) { } public int getPosition() { return position; } public void setPosition(int position) { this.position = position; } public void recycleView(View view) { } } }