Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
5 / 3 / 2
Регистрация: 14.03.2018
Сообщений: 227

Многоуровневый ExpandableListView

14.09.2023, 20:54. Показов 307. Ответов 0

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. Я пытаюсь построить древовидную структуру с несколькими уровнями, подобную той, что представлена на странице https://github.com/sadra/NLeve... ree/master.
Однако возникла проблема - когда я открываю группу, у нее есть три вложенные подгруппы (то есть три группы) на втором уровне, и я не могу раскрыть эти подгруппы и увидеть содержимое внутри них.
XML
1
2
3
4
5
6
7
8
      
<ExpandableListView
                android:id="@+id/expandableListView"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:groupIndicator="@null"
                android:indicatorLeft="?android:attr/expandableListPreferredItemIndicatorLeft" />
Класс MainActivity:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
    public class Group {
        private int id;
        private String name;
        private List<Child> children;
        private List<Group> subGroups;
        private List<SubGroup> subSubGroups;
        public Group(int id, String name, List<Group> subGroups, List<Child> children) {
            this.id = id;
            this.name = name;
            this.subGroups = subGroups;
            this.children = children;
        }
        public String getName() {return name;}
        public int getId() {return id;}
        public List<Child> getChildren() {return children;}
        public void setId(int id) {this.id = id;}
        public void setName(String name) {this.name = name;}
        public List<Group> getSubGroups() {return subGroups;}
        public List<SubGroup> getSubSubGroups() { return subSubGroups; }
 
    }
 
    public class Child {
        private int id;
        private String name;
        private int parentId;
        private int id_izd;
        private String description;
        private int level;
 
        public Child(int id, String name, int parentId, int id_izd, int level) {
            this.id = id;
            this.name = name;
            this.parentId = parentId;
            this.id_izd = id_izd;
            this.description = description;
            this.level = level;
        }
        // Геттеры и сеттеры
        public int getId() { return id; }
        public void setId(int id) { this.id = id; }
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        public int getParentId() { return parentId; }
        public int getIdIzd() { return id_izd; }
        public String getDescription() { return description; }
        public int getLevel() { return level; }
    }
    public class SubGroup {
        private String name;
        private List<Child> children;
        private List<SubGroup> subSubGroups;
        public SubGroup(String name, List<Child> children) {
            this.name = name;
            this.children = children;
            this.subSubGroups = new ArrayList<>();
        }
        public List<Child> getChildren() {return children;}
        public String getName() { return name; }
        public List<SubGroup> getSubSubGroups() {
            return subSubGroups;
        }
    }
private void showData() {
        List<Group> parentItems = new ArrayList<>();
        String query = "WITH RECURSIVE tree AS (" +
                "    SELECT id, name, parent_id, id_izd, rang, 1 AS level" +
                "    FROM tree_izd" +
                "    WHERE parent_id IS NULL" +
                "    UNION ALL" +
                "    SELECT t.id, t.name, t.parent_id, t.id_izd, t.rang, tree.level + 1 AS level" +
                "    FROM tree_izd t" +
                "    JOIN tree ON t.parent_id = tree.id )" +
                "SELECT * FROM tree order by level, rang;";
        Cursor cursor = mDb.rawQuery(query, null);
        while (cursor.moveToNext()) {
            @SuppressLint("Range") int id = cursor.getInt(cursor.getColumnIndex("id"));
            @SuppressLint("Range") String name = cursor.getString(cursor.getColumnIndex("name"));
            @SuppressLint("Range") int parentId = cursor.getInt(cursor.getColumnIndex("parent_id"));
            @SuppressLint("Range") int level = cursor.getInt(cursor.getColumnIndex("level"));
            @SuppressLint("Range") int id_izd = cursor.getInt(cursor.getColumnIndex("id_izd"));
            processData(parentItems, id, name, parentId, level, id_izd);
        }
        totalCount = getTotalCount();
        String selectedCountText;
        if (TextUtils.isEmpty(searchText)) {
            selectedCountText = "Всего " + totalCount;
        } else {
            selectedCountText = "Отобрано " + selectedCount + " из " + totalCount;
        }
        selectedCountTextView.setText(selectedCountText);
        printGroups(parentItems, 0);
        parentItems.size();
 
        ExpandableListView expandableListView = findViewById(R.id.expandableListView);
        expandableListAdapter = new YourExpandableListAdapter(parentItems);
        expandableListView.setAdapter(expandableListAdapter);
 
    }
    private void processData(List<Group> parentItems, int id, String name, int parentId, int level, int id_izd) {
        if (level == 1) {
            // Родительский элемент
            Group parentItem = new Group(id, name, new ArrayList<>(), new ArrayList<>());
            parentItems.add(parentItem);
        } else if (level > 1) {
            Group parentGroup = findParentGroup(parentItems, parentId);
 
            if (parentGroup != null) {
                if (id_izd == 0) {
                    // Подгруппа
                    Group subGroup = new Group(id, name, new ArrayList<>(), new ArrayList<>());
                    parentGroup.getSubGroups().add(subGroup);
                } else {
                    // Дочерний элемент
                    Child childItem = new Child(id, name, parentId, id_izd, level);
                    parentGroup.getChildren().add(childItem);
                }
            }
        }
    }
 
    private Group findParentGroup(List<Group> parentItems, int parentId) {
        for (Group parentItem : parentItems) {
            if (parentItem.getId() == parentId) {
                return parentItem;
            }
            // найти в подгруппах, если они есть
            for (Group subGroup : parentItem.getSubGroups()) {
                if (subGroup.getId() == parentId) {
                    return subGroup;
                }
            }
        }
        return null; // Не найдено
    }
Адаптер:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
public class YourExpandableListAdapter extends BaseExpandableListAdapter {
    private List<MainActivity.Group> groups;
    private int selectedGroupPosition = -1;
    private int selectedChildPosition = -1;
 
    public YourExpandableListAdapter(List<MainActivity.Group> groups) {
        this.groups = groups;
    }
    public void setSelectedGroupPosition(int groupPosition) { selectedGroupPosition = groupPosition; }
    public void setSelectedChildPosition(int childPosition) { selectedChildPosition = childPosition; }
    @Override
    public int getGroupCount() {
        return groups.size();
    }
    @Override
    public Object getGroup(int groupPosition) {
        return groups.get(groupPosition);
    }
    @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 boolean isChildSelectable(int groupPosition, int childPosition) { return true; }
    public int getChildrenCount(int groupPosition) {
        MainActivity.Group group = groups.get(groupPosition);
        List<MainActivity.Group> subGroups = group.getSubGroups();
        List<MainActivity.SubGroup> subSubGroups = group.getSubSubGroups();
 
        int subGroupCount = subGroups != null ? subGroups.size() : 0;
        int subSubGroupCount = subSubGroups != null ? subSubGroups.size() : 0;
        int childCount = group.getChildren() != null ? group.getChildren().size() : 0;
        // Учитываем дочерние элементы каждой подгруппы и подподгруппы
        if (subGroups != null) {
            for (MainActivity.Group subGroup : subGroups) {
                List<MainActivity.Child> subGroupChildren = subGroup.getChildren();
                childCount += (subGroupChildren != null ? subGroupChildren.size() : 0);
            }
        }
        // Учитываем дочерние элементы каждой подподгруппы
        if (subSubGroups != null) {
            for (MainActivity.SubGroup subSubGroup : subSubGroups) {
                List<MainActivity.Child> subSubGroupChildren = subSubGroup.getChildren();
                childCount += (subSubGroupChildren != null ? subSubGroupChildren.size() : 0);
            }
        }
        return childCount + subGroupCount + subSubGroupCount;
    }
 
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        MainActivity.Group group = groups.get(groupPosition);
        List<MainActivity.Group> subGroups = group.getSubGroups();
        List<MainActivity.SubGroup> subSubGroups = group.getSubSubGroups();
        List<MainActivity.Child> children = group.getChildren();
 
        int subGroupsCount = subGroups != null ? subGroups.size() : 0;
        int subSubGroupsCount = subSubGroups != null ? subSubGroups.size() : 0;
 
        if (childPosition < subGroupsCount) {
            // Элемент - подгруппа
            MainActivity.Group subGroup = subGroups.get(childPosition);
            return subGroup;
        } else if (childPosition < subGroupsCount + subSubGroupsCount) {
            // Элемент - подподгруппа
            MainActivity.SubGroup subSubGroup = subSubGroups.get(childPosition - subGroupsCount);
            return subSubGroup;
        } else {
            int childPositionInGroup = childPosition - subGroupsCount - subSubGroupsCount;
            if (children != null && childPositionInGroup < children.size()) {
                // Элемент - дочерний элемент
                return children.get(childPositionInGroup);
            }
        }
        return null;
    }
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View groupView = inflater.inflate(R.layout.group_layout, null);
        MainActivity.Group group = (MainActivity.Group) getGroup(groupPosition);
        TextView groupNameTextView = groupView.findViewById(R.id.groupNameTextView);
        groupNameTextView.setText(group.getName());
 
        ImageView groupIndicator = groupView.findViewById(R.id.groupIndicator);
        groupIndicator.setImageResource(isExpanded ? R.drawable.ic_arrow_up : R.drawable.ic_arrow_down);
 
        return groupView;
    }
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        Object childOrSubGroup = getChild(groupPosition, childPosition);
 
        if (childOrSubGroup instanceof MainActivity.Group) {
            // Этот элемент - подгруппа
            View subgroupView = inflater.inflate(R.layout.subgroup_layout, null);
 
            MainActivity.Group subGroup = (MainActivity.Group) childOrSubGroup;
 
            TextView subGroupNameTextView = subgroupView.findViewById(R.id.subgroupNameTextView);
            subGroupNameTextView.setText(subGroup.getName());
 
            ImageView subgroupIndicator = subgroupView.findViewById(R.id.subgroupIndicator);
            subgroupIndicator.setImageResource(isLastChild ? R.drawable.ic_arrow_up : R.drawable.ic_arrow_down);
 
            return subgroupView;
        } else if (childOrSubGroup instanceof MainActivity.Child) {
            // Этот элемент - дочерний элемент
            View childView = inflater.inflate(R.layout.child_layout, null);
            MainActivity.Child child = (MainActivity.Child) childOrSubGroup;
 
            TextView childNameTextView = childView.findViewById(R.id.childNameTextView);
            childNameTextView.setText(child.getName());
 
            if (groupPosition == selectedGroupPosition && childPosition == selectedChildPosition) {
                // Выделение элемента
                childView.setBackgroundColor(Color.parseColor("#FFEC8B"));
            } else {
                // Снятие выделения с других элементов
                childView.setBackgroundColor(Color.TRANSPARENT);
            }
            return childView;
        } else {
            return new View(parent.getContext());
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.09.2023, 20:54
Ответы с готовыми решениями:

ExpandableListView
Доброго времени суток! Пытаюсь сделать подсветку элементов ExpandableListView по аналогии с ListView &lt;ExpandableListView ...

ExpandableListView
Подскажите как быть, есть список груп(допустим их всего 3) и есть список дочерних элементов у каждой группы свой. допустим мы развернули...

ExpandableListView не скролит
Есть разметка, которая содержит последним элементом ExpandableListView (кастомизирую его). &lt;?xml version=&quot;1.0&quot;...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.09.2023, 20:54
Помогаю со студенческими работами здесь

OnClick ExpandableListView
Пример для ItemList, который нашел в интернете. listview.setOnItemClickListener(new OnItemClickListener(){ @Override ...

Прослушать ExpandableListView
Здраствуйте, у меня есть код прослушки, он работает! но мне нужно вытянуть текст который находитса в етом chold_view код: ...

Не раскрывается ExpandableListView
Здравствуйте помогите найти ошибку в разметке, ExpandableListView не хочет раскрываться, хотя данные в нем есть. Спасибо заранее. ...

Группировка по типу в expandablelistview
Есть класс списка объектов class Objects{ String name; int groupId; } и класс списка групп

Нажатие на элементы ExpandableListView
Добрый день. У меня есть ExpandableListView в нём сделан setOnChildClickListener получается так, что в item элемент списка может быть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru