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