[Android]BaseExpandableListAdapter实现可折叠的列表

简介:

使用BaseExpandableListAdapter 可以实现所谓的可折叠的列表,例如QQ里好友的分组的功能。

基于基于BaseExpandableListAdapter扩展的ExpandableList用法,现在网上流行的主要有两种:第一种是向BaseExpandableListAdapter传入两个数组,第一个是表示Group(目录头)信息的一维数组,第二个是表示Child(目录子项)的二维数组数组;第二种是构建两个类,一个是表示目录信息的GroupInfo类,另一个是表示子项信息的ChildInfo类,然后传入BaseExpandableListAdapter。通过对比发现,第一种方法由于数组是固定的,而实际项目中往往需要动态变化的目录和子项,因此用处不大,第二种方法文件太多,实现复杂。这里提供一种方法,传递两个个动态的二维数组来实现目录结构。


package com.example.test;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.view.View.OnClickListener;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //Group数据
        ArrayList<String> groupList = new ArrayList<String>();
        groupList.add("我的好友");
        groupList.add("我的亲人");
        groupList.add("我的同学");
        //Child数据
        ArrayList<String> itemList1 = new ArrayList<String>();
        itemList1.add("小米");
        itemList1.add("小李");
        ArrayList<String> itemList2 = new ArrayList<String>();
        itemList2.add("小丽");
        itemList2.add("小小");
        itemList2.add("小可");
        ArrayList<String> itemList3 = new ArrayList<String>();
        itemList3.add("小南");
        itemList3.add("小飞");
        itemList3.add("小丁");
        itemList3.add("小美");
        ArrayList<ArrayList<String>> childList = new ArrayList<ArrayList<String>>();
        childList.add(itemList1);
        childList.add(itemList2);
        childList.add(itemList3);
        //可折叠List
        ExpandableListView list = new ExpandableListView(this);
        ExpandableListAdapter mAdapter = new MyExpandableListAdapter(groupList, childList);
        list.setAdapter(mAdapter);

        list.setCacheColorHint(0x00000000);
        list.setSelector(new ColorDrawable(Color.TRANSPARENT));
        list.setGroupIndicator(null);
        for (int i = 0; i < mAdapter.getGroupCount(); i++) {
            list.expandGroup(i);
        }
        setContentView(list);
    }
    //Adapter
    private class MyExpandableListAdapter extends BaseExpandableListAdapter {
        private ArrayList<String> groupList;
        private ArrayList<ArrayList<String>> childList;

        MyExpandableListAdapter(ArrayList<String> groupList, ArrayList<ArrayList<String>> childList) {
            this.groupList = groupList;
            this.childList = childList;
        }

        public Object getChild(int groupPosition, int childPosition) {
            return childList.get(groupPosition).get(childPosition);
        }

        private int selectedGroupPosition = -1;
        private int selectedChildPosition = -1;

        public void setSelectedPosition(int selectedGroupPosition, int selectedChildPosition) {
            this.selectedGroupPosition = selectedGroupPosition;
            this.selectedChildPosition = selectedChildPosition;
        }

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

        public int getChildrenCount(int groupPosition) {
            return childList.get(groupPosition).size();
        }

        public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
            TextView textView = null;
            if (convertView == null) {
                textView = new TextView(MainActivity.this);
                textView.setPadding(32, 10, 0, 10);
                convertView = textView;
            } else {
                textView = (TextView) convertView;
            }

            textView.setText(getChild(groupPosition, childPosition).toString());

            if (groupPosition == selectedGroupPosition) {
                if (childPosition == selectedChildPosition) {
                    textView.setBackgroundColor(0xffb6ddee);
                } else {
                    textView.setBackgroundColor(Color.TRANSPARENT);
                }
            }

            textView.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    setSelectedPosition(groupPosition, childPosition);
                    notifyDataSetChanged();
                }
            });
            return textView;
        }

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

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

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

        public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
            LinearLayout cotain = new LinearLayout(MainActivity.this);
            cotain.setPadding(0, 10, 0, 10);
            cotain.setGravity(Gravity.CENTER_VERTICAL);

            ImageView imgIndicator = new ImageView(MainActivity.this);
            TextView textView = new TextView(MainActivity.this);
            textView.setText(getGroup(groupPosition).toString());
            textView.setPadding(5, 0, 0, 0);

            if (isExpanded) {
                imgIndicator.setBackgroundResource(R.drawable.bg_arrow_up);
            } else {
                imgIndicator.setBackgroundResource(R.drawable.bg_arrow_down);
            }
            cotain.addView(imgIndicator);
            cotain.addView(textView);
            return cotain;
        }

        public boolean hasStableIds() {
            return true;
        }

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

groupList 用于组名(类似QQ的好友、同学、朋友),

childList 每个元素都是一组子数据(类似QQ同学中的张三,李四的集合)




目录
相关文章
|
25天前
|
存储 消息中间件 人工智能
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
55 4
|
8月前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
207 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
存储 数据库 Android开发
安卓Jetpack Compose+Kotlin,支持从本地添加音频文件到播放列表,支持删除,使用ExoPlayer播放音乐
为了在UI界面添加用于添加和删除本地音乐文件的按钮,以及相关的播放功能,你需要实现以下几个步骤: 1. **集成用户选择本地音乐**:允许用户从设备中选择音乐文件。 2. **创建UI按钮**:在界面中创建添加和删除按钮。 3. **数据库功能**:使用Room数据库来存储音频文件信息。 4. **更新ViewModel**:处理添加、删除和播放音频文件的逻辑。 5. **UI实现**:在UI层支持添加、删除音乐以及播放功能。
|
10月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
902 11
|
Android开发 开发者 UED
Android项目架构设计问题之加载数据到列表如何解决
Android项目架构设计问题之加载数据到列表如何解决
87 0
|
存储 API Android开发
29. 【Android教程】折叠列表 ExpandableListView
29. 【Android教程】折叠列表 ExpandableListView
1143 2
|
安全 Java API
Android获取Wi-Fi网络列表
【6月更文挑战第21天】
318 0
|
Android开发
Android TV开发总结(四)通过RecycleView构建一个TV app列表页(仿腾讯视频TV版)
原文:Android TV开发总结(四)通过RecycleView构建一个TV app列表页(仿腾讯视频TV版) 版权声明:我已委托“维权骑士”(rightknights.com)为我的文章进行维权行动.转载务必转载所有,且须注明出处。
2306 0
|
21天前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
240 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
1月前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
110 6

热门文章

最新文章

下一篇
日志分析软件