📜  Android中的BaseExpandableListAdapter示例(1)

📅  最后修改于: 2023-12-03 15:13:22.505000             🧑  作者: Mango

Android中的BaseExpandableListAdapter示例

在Android开发中,展示具有分组的列表是一种很常见的需求,在实现时我们可以使用ExpandableListView控件,而针对ExpandableListView的适配器就是BaseExpandableListAdapter。本文将介绍BaseExpandableListAdapter的使用方法和示例。

简介

BaseExpandableListAdapter是一个抽象基类,用于为ExpandableListView提供数据源,同时也是一个ListAdapter的实现。和普通的ListAdapter类似,BaseExpandableListAdapter同样需要实现一系列的方法来完成数据源获取与显示。

使用方法

BaseExpandableListAdapter提供以下回调方法:

  • getGroupCount():获取分组数量

  • getChildrenCount(int groupPosition):获取指定分组下的子项数量

  • getGroup(int groupPosition):获取指定分组数据

  • getChild(int groupPosition, int childPosition):获取指定分组中的子项数据

  • getGroupId(int groupPosition):获取指定分组的ID

  • getChildId(int groupPosition, int childPosition):获取指定分组中的子项ID

  • hasStableIds():是否开启稳定ID

  • getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent):获取指定分组的视图

  • getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent):获取指定分组中指定子项的视图

  • isChildSelectable(int groupPosition, int childPosition):指定分组中的子项是否可选中

示例:

public class MyAdapter extends BaseExpandableListAdapter {

    private List<GroupData> groupDataList;

    public MyAdapter(List<GroupData> groupDataList) {
        this.groupDataList = groupDataList;
    }

    @Override
    public int getGroupCount() {
        return groupDataList.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return groupDataList.get(groupPosition).getChildren().size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return groupDataList.get(groupPosition);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return groupDataList.get(groupPosition).getChildren().get(childPosition);
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupDataList.get(groupPosition).getId();
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return groupDataList.get(groupPosition).getChildren().get(childPosition).getId();
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.group_item_layout, parent, false);
        }
        TextView groupTv = convertView.findViewById(R.id.group_tv);
        groupTv.setText(groupDataList.get(groupPosition).getName());
        return convertView;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.child_item_layout, parent, false);
        }
        TextView childTv = convertView.findViewById(R.id.child_tv);
        childTv.setText(groupDataList.get(groupPosition).getChildren().get(childPosition).getName());
        return convertView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
}

在上述示例中,我们需要将展示所需的数据传入适配器中,可以通过构造函数进行传递,再通过重写相应的回调方法来完成数据的获取和视图展示。

结语

BaseExpandableListAdapter是实现具有分组的列表的一个常用适配器,在使用时只需重写相应的回调方法即可。