Android BaseAdapter与BaseExpandableListAdapter封装

来源:互联网 发布:淘宝网的域名怎么设置 编辑:程序博客网 时间:2024/06/11 03:11

在用ListView与ExpandableListView时,我们要用到BaseAdapter与BaseExpandableListAdapter来填充View。但继承这两个类,方法比较多。进行一下封装。

一、BaseAdapter的封装

1.ViewHolder类代码:

import android.content.Context;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;public class ViewHolder {    private SparseArray<View> mViews;    private View mConvertView;    public static ViewHolder getHolder(Context mContext,View convertView, int layoutId){        if (convertView == null) {            return new ViewHolder(mContext,  layoutId);        }        return (ViewHolder) convertView.getTag();    }    public ViewHolder(Context mContext,  int layoutId) {        this.mViews = new SparseArray<View>();        mConvertView = LayoutInflater.from(mContext).inflate(layoutId, null);        mConvertView.setTag(this);    }    public <T extends View> T getView(int viewId) {        View view = mViews.get(viewId);        if (view == null) {            view = mConvertView.findViewById(viewId);            mViews.put(viewId, view);        }        return (T) view;    }    public View getConvertView() {        return mConvertView;    }}

2.CommAdapter类继承BaseAdapter:

import java.util.ArrayList;import java.util.List;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;public abstract class CommAdapter<T> extends BaseAdapter {    private Context mContext;    //布局id    private int layoutId;    //数据    private List<T> mData = new ArrayList<T>();    public CommAdapter(Context context,int id,List<T> data) {        mContext = context;        layoutId = id;        mData = data;    }    public void clearData(){        mData.clear();        notifyDataSetChanged();    }    public void addData(List<T> data){        mData.addAll(data);        notifyDataSetChanged();    }    public void updateData(List<T> data){        mData.clear();        addData(data);    }    @Override    public int getCount() {        return mData.size();    }    @Override    public Object getItem(int position) {        return mData.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder viewHolder = getViewHolder(convertView);        itemView(mData.get(position), viewHolder,position);        return viewHolder.getConvertView();    }    private ViewHolder getViewHolder( View convertView) {        return ViewHolder.getHolder(mContext, convertView, layoutId);    }    public abstract void itemView(T data,ViewHolder viewHolder,int postion);}

3.listView调用:

listView.setAdapter(new CommAdapter<String>(MainActivity.this,R.layout.list_item,data) {            @Override            public void itemView(String data, ViewHolder viewHolder, int postion) {                //在此方法中获取viewHolder中的view,viewHolder.getView(viewId),设置view与相应的点击事件,            }        });

二、BaseExpandableListAdapter的封装

1.ExpandableAdapter类继承BaseExpandableListAdapter:

import java.util.ArrayList;import java.util.List;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.BaseExpandableListAdapter;public abstract class ExpandableAdapter<X, Y> extends BaseExpandableListAdapter{    private Context mContext;    private int groupLayoutId,itemLayoutId;    private List<GoupData<X, Y>> mGroupData = new ArrayList<GoupData<X, Y>>();    public ExpandableAdapter(Context context,int gId,int iId,List<GoupData<X, Y>> gDatas) {        this.mContext = context;        this.groupLayoutId = gId;        this.itemLayoutId = iId;        this.mGroupData = gDatas;    }    @Override    public int getGroupCount() {        return mGroupData.size();    }    @Override    public int getChildrenCount(int groupPosition) {         return mGroupData.get(groupPosition).getmChild() == null ? 0 : mGroupData.get(groupPosition).getmChild().size();    }    @Override    public Object getGroup(int groupPosition) {        return mGroupData.get(groupPosition);    }    @Override    public Object getChild(int groupPosition, int childPosition) {          return mGroupData.get(groupPosition).getmChild().get(childPosition);    }    @Override    public long getGroupId(int groupPosition) {        return groupPosition;    }    @Override    public long getChildId(int groupPosition, int childPosition) {        return mGroupData.get(groupPosition).getmChild().size();    }    @Override    public boolean hasStableIds() {        return false;    }    @Override    public View getGroupView(int groupPosition, boolean isExpanded,            View convertView, ViewGroup parent) {        ViewHolder viewHolder = getViewHolder(convertView, groupLayoutId);        groupView(groupPosition, isExpanded, viewHolder, (GoupData<X, Y>) getGroup(groupPosition));        return viewHolder.getConvertView();    }    @Override    public View getChildView(int groupPosition, int childPosition,            boolean isLastChild, View convertView, ViewGroup parent) {        ViewHolder viewHolder = getViewHolder(convertView, itemLayoutId);        childView(groupPosition, childPosition,isLastChild, viewHolder,(Y) getChild(groupPosition, childPosition));        return viewHolder.getConvertView();    }    @Override    public boolean isChildSelectable(int groupPosition, int childPosition) {        return true;    }    private ViewHolder getViewHolder( View convertView,int layoutId) {        return ViewHolder.getHolder(mContext, convertView, layoutId);    }    /**父view回调**/    public abstract void groupView(int groupPosition, boolean isExpanded,ViewHolder groupHolder,GoupData<X, Y> itemData);    /**子view回调**/    public abstract void childView(int groupPosition, int childPosition,boolean isLastChild,ViewHolder childHolder,Y itemData);}

其中ViewHolder为上面的ViewHolder。
2.GoupData如下 :

import java.util.List;//使用泛型public class GoupData<X,Y> {    //本身属性    private X x;    //子列表    private List<Y> mChild;    public X getX() {        return x;    }    public void setX(X x) {        this.x = x;    }    public List<Y> getmChild() {        return mChild;    }    public void setmChild(List<Y> mChild) {        this.mChild = mChild;    }}

3.调用实现 :

expandableListView.setAdapter(new ExpandableAdapter<String,String>(this, R.layout.group_item, R.layout.child_item,gDatas){            @Override            public void groupView(int groupPosition, boolean isExpanded,                    ViewHolder groupHolder, GoupData<String, String> itemData) {                // 通过groupHolder获取view,设置父布局            }            @Override            public void childView(int groupPosition, int childPosition,                    boolean isLastChild, ViewHolder childHolder, String itemData) {                // 通过childHolder获取view,设置子布局,childHolder.getView(viewId)            }            });
原创粉丝点击