作用
把都需要实现的上放到抽象父类中,具体细节交给子类实现;
实现了代码的复用;
Demo
以常用的listview的adapter举例
//把通用操作抽取到抽象父类中
public abstract class MyBaseAdapter<T> extends BaseAdapter {
Context mContext;
List<T> mDatas;
LayoutInflater mLayoutInflater;
public MyBaseAdapter(Context context, List<T> datas) {
mContext = context;
mDatas = datas;
mLayoutInflater=LayoutInflater.from(context);
}
@Override
public int getCount() {
return mDatas!=null?mDatas.size():0;
}
@Override
public T getItem(int position) {
return mDatas!=null?mDatas.get(position):null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public abstract View getView(int position, View convertView, ViewGroup parent);
//datas相关
public void setDatas(List<T> datas){
mDatas=datas;
notifyDataSetChanged();
}
public void clearDatas(){
mDatas=null;
notifyDataSetChanged();
}
public void appendDatas(List<T> datas){
if (mDatas==null)mDatas=new ArrayList<>();
mDatas.addAll(datas);
}
public void appendDatas(T data){
if (mDatas==null)mDatas=new ArrayList<>();
mDatas.add(data);
}
}
public abstract class CommonAdapter<T,H> extends MyBaseAdapter<T> {
public CommonAdapter(Context context, List<T> datas) {
super(context, datas);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
T data = mDatas.get(position);
H holder=null;
if (convertView==null){
convertView=createConvertView(mLayoutInflater,position,parent,getItemViewType(position));
holder=createViewHolder(convertView,data,position);
convertView.setTag(holder);
}else{
holder= (H) convertView.getTag();
}
bindDatas(holder,data,position);
return convertView;
}
public abstract View createConvertView(LayoutInflater layoutInflater, int position, ViewGroup parent, int itemViewType);
public abstract H createViewHolder(View convertView, T data, int position);
protected abstract void bindDatas(H holder, T data, int position);
}
//细节由子类实现
public class CommonAdapterDEMO extends CommonAdapter<String, CommonAdapterDEMO.Holder > {
public CommonAdapterDEMO(Context context, List datas) {
super(context, datas);
}
@Override
public View createConvertView(LayoutInflater layoutInflater, int position, ViewGroup parent, int itemViewType) {
View layout = layoutInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
return layout;
}
@Override
public Holder createViewHolder(View convertView, String data, int position) {
return new Holder(convertView);
}
@Override
protected void bindDatas(Holder holder, String data, int position) {
holder.tv.setText(data);
}
class Holder {
TextView tv;
public Holder(View view) {
tv= (TextView) view.findViewById(android.R.id.text1);
}
}
}