• 【android】用 ExpandableListView 来实现 TreeView树形菜单视图


    使用 ExpandableListView 来实现 TreeView

    创建一个 ExpandableListAdapter 来为其提供数据。以下演示了如何使用 ExpandableListView 来展示树形结构的数据:

    首先,在布局文件中添加 ExpandableListView:

    <ExpandableListView
        android:id="@+id/expandableListView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
    

    接下来,创建一个 ExpandableListAdapter 类来管理树形结构的数据:

    public class MyExpandableListAdapter extends BaseExpandableListAdapter {
    
        private Context context;
        private List<String> groupList; // 父项数据
        private Map<String, List<String>> childMap; // 子项数据
    
        public MyExpandableListAdapter(Context context, List<String> groupList, Map<String, List<String>> childMap) {
            this.context = context;
            this.groupList = groupList;
            this.childMap = childMap;
        }
    
        @Override
        public Object getChild(int groupPosition, int childPosition) {
            return childMap.get(groupList.get(groupPosition)).get(childPosition);
        }
    
        @Override
        public long getChildId(int groupPosition, int childPosition) {
            return childPosition;
        }
    
        @Override
        public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
            String childText = (String) getChild(groupPosition, childPosition);
            if (convertView == null) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.list_item, null);
            }
            TextView textView = convertView.findViewById(R.id.listItem);
            textView.setText(childText);
            return convertView;
        }
    
        @Override
        public int getChildrenCount(int groupPosition) {
            return childMap.get(groupList.get(groupPosition)).size();
        }
    
        @Override
        public Object getGroup(int groupPosition) {
            return groupList.get(groupPosition);
        }
    
        @Override
        public int getGroupCount() {
            return groupList.size();
        }
    
        @Override
        public long getGroupId(int groupPosition) {
            return groupPosition;
        }
    
        @Override
        public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
            String groupText = (String) getGroup(groupPosition);
            if (convertView == null) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.list_group, null);
            }
            TextView textView = convertView.findViewById(R.id.listGroup);
            textView.setText(groupText);
            return convertView;
        }
    
        @Override
        public boolean hasStableIds() {
            return false;
        }
    
        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }
    }
    

    在上述代码中,我们创建了一个自定义的 ExpandableListAdapter,用于管理父项和子项的数据展示。在 getChildView 和 getGroupView 方法中,我们根据数据来填充父项和子项的视图。

    最后,在 Activity 或者 Fragment 中设置 ExpandableListView 的适配器并提供数据:

    ExpandableListView expandableListView = findViewById(R.id.expandableListView);
    MyExpandableListAdapter adapter = new MyExpandableListAdapter(getContext(), groupList, childMap); // groupList 和 childMap 是你的数据
    expandableListView.setAdapter(adapter);
    

    list_item为名称或名称+logo

    如果你想在 ExpandableListView 中实现第一级为名称,第二级为名称+logo的效果,你可以修改 MyExpandableListAdapter 类的 getChildView 方法来实现这个需求。以下是一个简单的示例代码,展示了如何为第二级添加名称和 logo:

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        String childText = (String) getChild(groupPosition, childPosition);
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.list_item, null);
        }
        TextView textView = convertView.findViewById(R.id.listItem);
        ImageView imageView = convertView.findViewById(R.id.listLogo); // 假设你在布局文件中有一个 ImageView 用于显示 logo
        textView.setText(childText);
        
        // 设置对应的 logo
        if (childText.equals("名称1")) {
            imageView.setImageResource(R.drawable.logo1);
        } else if (childText.equals("名称2")) {
            imageView.setImageResource(R.drawable.logo2);
        }
        
        return convertView;
    }
    

    在上述代码中,我们修改了 getChildView 方法,为每个子项设置了对应的 logo。假设你在布局文件中有一个 ImageView 用于显示 logo,我们根据子项的名称来设置对应的 logo。

    这样,当你设置 ExpandableListView 的适配器后,每个第二级子项将会显示名称和对应的 logo。

    布局文件

    以下是一个简单的布局文件示例,用于在 ExpandableListView 中展示第一级为名称,第二级为名称+logo的效果:

    list_group.xml(用于展示第一级名称):

    <TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/listGroup"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:textSize="20sp"
        android:textColor="@android:color/black"/>
    

    list_item.xml(用于展示第二级名称和logo):

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="16dp">
    
        <TextView
            android:id="@+id/listItem"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            android:textColor="@android:color/black"/>
    
        <ImageView
            android:id="@+id/listLogo"
            android:layout_width="24dp"
            android:layout_height="24dp"
            android:layout_marginStart="16dp"/>
    LinearLayout>
    
  • 相关阅读:
    Foxit PDF SDK Windows 9.1 Crack
    [Python]Selenium-自动化测试
    MySQL 保姆级教程(一):了解 SQL
    一个关于SPS PDSCH HARQ-ACK的专利
    万字剖析Ribbon核心组件以及运行原理
    web前端期末大作业——网页制作基础大二dw作业——动画漫展学习资料电影模板(6页)
    LED显示屏像素技术
    vue3 - setup之defineEmits
    .NET Core学习笔记
    ChatGLM系列八:微调医疗问答系统
  • 原文地址:https://blog.csdn.net/gao511147456/article/details/139819534