Android BaseAdapter与BaseExpandableListAdapter封装

本文介绍了一种简化ListView与ExpandableListView使用的封装方法。通过自定义CommAdapter和ExpandableAdapter类,实现了BaseAdapter和BaseExpandableListAdapter的功能,并提供了一种更简洁的方式来处理数据绑定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

            }

            });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值