Android多级展开列表实现

简介

在Android开发中,经常需要实现多级展开列表来展示层次结构的数据,比如商品分类、城市选择等。本文将介绍如何使用ExpandableListView控件实现Android多级展开列表。

准备工作

在开始实现之前,我们需要在Android Studio中创建一个新的Android项目,并添加相应的依赖项。

步骤

步骤一:创建数据模型

在实现多级展开列表之前,我们需要先定义数据模型。假设我们要实现的是商品分类的多级展开列表,那么我们可以创建一个Category类,其中包含了商品分类的名称和子分类列表。

代码示例:

public class Category {
    private String name;
    private List<Category> subCategories;

    public Category(String name, List<Category> subCategories) {
        this.name = name;
        this.subCategories = subCategories;
    }

    public String getName() {
        return name;
    }

    public List<Category> getSubCategories() {
        return subCategories;
    }
}

步骤二:创建Adapter

接下来,我们需要创建一个Adapter来将数据模型绑定到ExpandableListView上。我们可以继承BaseExpandableListAdapter类,并实现其相应的方法。

代码示例:

public class CategoryAdapter extends BaseExpandableListAdapter {
    private List<Category> categories;

    public CategoryAdapter(List<Category> categories) {
        this.categories = categories;
    }

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

    @Override
    public int getChildrenCount(int groupPosition) {
        return categories.get(groupPosition).getSubCategories().size();
    }

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

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

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

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

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        // 创建并返回用于显示组视图的布局
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        // 创建并返回用于显示子视图的布局
    }

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

步骤三:创建布局文件

接下来,我们需要创建布局文件来定义展示组视图和子视图的样式。通常我们会创建两个布局文件,一个用于显示组视图,一个用于显示子视图。

代码示例: group_item_layout.xml:

<LinearLayout
    ...
    android:orientation="horizontal"
    ...>
    <ImageView
        ...
        android:id="@+id/group_icon"
        ... />
    <TextView
        ...
        android:id="@+id/group_name"
        ... />
</LinearLayout>

child_item_layout.xml:

<LinearLayout
    ...
    android:orientation="horizontal"
    ...>
    <ImageView
        ...
        android:id="@+id/child_icon"
        ... />
    <TextView
        ...
        android:id="@+id/child_name"
        ... />
</LinearLayout>

步骤四:绑定数据到布局

在Adapter的getGroupView和getChildView方法中,我们需要创建并返回用于显示组视图和子视图的布局,并将数据绑定到布局上。

代码示例:

@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);
    }

    ImageView icon = convertView.findViewById(R.id.group_icon);
    TextView name = convertView.findViewById(R.id.group_name);

    Category category = categories.get(groupPosition);
    icon.setImageResource(category.getIcon());
    name.setText(category.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);
    }

    ImageView icon = convertView.findViewById(R.id.child_icon);
    TextView name = convertView.findViewById(R.id.child