在用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)
}
});