Android中的展开收起列表是一种常见的交互方式,它允许用户点击列表项来展开或收起更多的相关内容。这种列表通常用于显示较长的文本内容,以便在有限的空间中提供更多信息。在本文中,我们将通过代码示例介绍如何在Android应用程序中实现展开收起列表。

实现方式

要实现展开收起列表,我们可以使用ExpandableListView类。这个类是Android提供的一个可以展开和收起的列表视图,它继承自ListView类。通过添加适当的适配器和处理事件,我们可以轻松地实现展开收起列表的功能。

代码示例

下面是一个简单的示例,展示了如何使用ExpandableListView实现展开收起列表的功能。

首先,在布局文件中定义一个ExpandableListView

<ExpandableListView
    android:id="@+id/expandableListView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@android:color/darker_gray"
    android:dividerHeight="0.5dp" />

接下来,在Activity中找到该ExpandableListView并设置适配器:

ExpandableListView expandableListView = findViewById(R.id.expandableListView);
ExpandableListAdapter adapter = new ExpandableListAdapter(this, dataList);
expandableListView.setAdapter(adapter);

在上述代码中,ExpandableListAdapter是一个自定义的适配器类,用于提供数据和视图。你需要根据自己的需求实现这个适配器类。

最后,我们需要添加适当的事件处理来实现展开和收起的功能。通过实现ExpandableListView.OnGroupClickListener接口,我们可以监听组项(即父项)的点击事件:

expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
    @Override
    public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
        if (expandableListView.isGroupExpanded(groupPosition)) {
            expandableListView.collapseGroup(groupPosition);
        } else {
            expandableListView.expandGroup(groupPosition);
        }
        return true; // 返回true表示消费了点击事件,不再执行默认的展开/收起操作
    }
});

这段代码会在父项被点击时执行,如果父项已经展开,则收起它;如果父项已经收起,则展开它。

完整代码示例

下面是一个完整的示例代码,包括自定义的适配器类:

public class MainActivity extends AppCompatActivity {
    private ExpandableListView expandableListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        expandableListView = findViewById(R.id.expandableListView);
        ExpandableListAdapter adapter = new ExpandableListAdapter(this, dataList);
        expandableListView.setAdapter(adapter);

        expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
                if (expandableListView.isGroupExpanded(groupPosition)) {
                    expandableListView.collapseGroup(groupPosition);
                } else {
                    expandableListView.expandGroup(groupPosition);
                }
                return true;
            }
        });
    }

    // 自定义的适配器类
    private class ExpandableListAdapter extends BaseExpandableListAdapter {
        private Context context;
        private List<String> groupList;
        private Map<String, List<String>> childMap;

        public ExpandableListAdapter(Context context, List<String> groupList, Map<String, List<String>> childMap) {
            this.context = context;
            this.groupList = groupList;
            this.childMap = childMap;
        }

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

        @Override
        public int getChildrenCount(int groupPosition) {
            String group = groupList.get(groupPosition);
            List<String> childList = childMap.get(group);
            return childList != null ? childList.size() : 0;
        }

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

        @Override
        public Object getChild(int groupPosition, int childPosition) {
            String group = groupList.get(groupPosition);
            List<String> childList = childMap.get(group);
            return childList != null ? childList.get(childPosition) : null;
        }

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

        @Override
        public long getChild