Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
XlorD59
1 / 1 / 0
Регистрация: 28.05.2013
Сообщений: 50
#1

Кастомный ExpandableListView - Android

09.05.2016, 10:42. Просмотров 148. Ответов 0
Метки нет (Все метки)

День добрый.
Пытаюсь реализовать свой ExpandableListView.

Цель - сделать трехуровневый список для выбора стран и регионов.

Структура примерно такая:

Java
1
2
3
4
5
6
7
8
-Европа
--Польша
--Германия
---Центральная
---Северная
-Азия
--Китай
--Япония
У стран и их частей (у центр Цермании, у самой Германии и тд) должны быть чекбоксы. Причем, при выборе целой страны, её регионы отмечаются автоматически.

Я написал два своих адаптера.
Получается два ExpandableListView вложенных друг в друга - один отвечает за список регионов, второй - за список стран и их частей.

В макетах стран и регионов находится RelativeLayout с одним TextView.

Адаптер для регионов:

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
public class RegionsAdapter extends BaseExpandableListAdapter {
 
    private List<Object> objects;
    private Activity activity;
    private LayoutInflater inflater;
 
    public RegionsAdapter(Activity activity, List<Object> objects) {
        this.objects = objects;
        this.activity = activity;
        this.inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
 
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return objects.get(groupPosition).getObjects().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) {
 
        Object object = (Object) getChild(groupPosition, childPosition);
        CustomExpandableListView subObjects = (CustomExpandableListView) convertView;
 
        if (convertView == null) {
            subObjects = new CustomExpandableListView(activity);
        }
        CountriesAdapter adapter = new CountriesAdapter(activity, object);
        subObjects.setAdapter(adapter);
 
        return subObjects;
    }
 
    @Override
    public int getChildrenCount(int groupPosition) {
        return objects.get(groupPosition).getObjects().size();
    }
 
    @Override
    public Object getGroup(int groupPosition) {
        return objects.get(groupPosition);
    }
 
    @Override
    public int getGroupCount() {
        return objects.size();
    }
 
    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }
 
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
 
        Object object = (Object) getGroup(groupPosition);
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.layout_region_item, null);
        }
 
        TextView name = (TextView) convertView.findViewById(R.id.name);
        name.setText(object.getName());
 
        return convertView;
    }
 
    @Override
    public boolean hasStableIds() {
        return true;
    }
 
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
}
Адаптер для стран и их частей:

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
public class CountriesAdapter extends BaseExpandableListAdapter {
 
    private Object object;
    private LayoutInflater inflater;
    private Activity activity;
 
    public CountriesAdapter(Activity activity, Object object) {
        this.activity = activity;
        this.object = object;
        this.inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
 
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return object.getObjects().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) {
 
        Object object = (Object) getChild(0, childPosition);
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.layout_country_item, null);
 
            Resources r = activity.getResources();
            float px40 = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 40, r.getDisplayMetrics());
            convertView.setPadding(
                    convertView.getPaddingLeft() + (int) px40,
                    convertView.getPaddingTop(),
                    convertView.getPaddingRight(),
                    convertView.getPaddingBottom());
        }
 
        TextView name = (TextView) convertView.findViewById(R.id.name);
        name.setText(object.getName());
 
        return convertView;
    }
 
    @Override
    public int getChildrenCount(int groupPosition) {
 
        if (object.getObjects() == null) {
            return 0;
        }
        return object.getObjects().size();
    }
 
    @Override
    public Object getGroup(int groupPosition) {
        return object;
    }
 
    @Override
    public int getGroupCount() {
        return 1;
    }
 
    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }
 
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
 
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.layout_country_item, null);
            Resources r = activity.getResources();
            float px20 = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics());
            convertView.setPadding(
                    convertView.getPaddingLeft() + (int) px20,
                    convertView.getPaddingTop(),
                    convertView.getPaddingRight(),
                    convertView.getPaddingBottom());
        }
 
        TextView name = (TextView) convertView.findViewById(R.id.name);
        name.setText(object.getName());
 
        return convertView;
    }
 
    @Override
    public boolean hasStableIds() {
        return true;
    }
 
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
}
И свой ExpandableListView:

Java
1
2
3
4
5
6
7
8
9
10
11
12
public class CustomExpandableListView extends ExpandableListView {
 
    public CustomExpandableListView(Context context) {
        super(context);
    }
 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        widthMeasureSpec = MeasureSpec.makeMeasureSpec(960, MeasureSpec.AT_MOST);
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(600, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}
Выглядит все это как-то так:
Кастомный ExpandableListView Кастомный ExpandableListView

Проблема в том, что если я заменю в макете стран TextView на CheckBox, и присвою этому CheckBox текст, то список стран перестанет раскрываться. Я не понимаю почему так происходит, может кто объяснить?

И ещё, не могу понять почему мой итоговый список не хочет разворачиваться на весь экран по вертикали - использует только где-то треть (на первом скрине видно, что нижние элементы исчезли).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2016, 10:42     Кастомный ExpandableListView
Посмотрите здесь:

Android Прослушать ExpandableListView
Android ExpandableListView
Обработчик нажатия в ExpandableListView Android
Android ExpandableListView на разных API
Android Expandablelistview совместно с listview
Android ExpandableListView не скролит
Свёрнутый список в ExpandableListView Android
ExpandableListView Android
Android Обновление состояния ExpandableListView
Android ExpandableListView обновление данных
OnClick ExpandableListView Android
Идентификация элементов в ExpandableListView Android

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 05:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru