Подтвердить что ты не робот

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

Я пытаюсь создать дерево категорий из заданного неизвестного размера или списка категорий категорий. Поэтому я пытаюсь создать общий расширяемый список, который может содержать 2+ количество уровней. Общая идея состоит в том, чтобы добавить к каждому ребенку, у которого есть еще один ExpandableListView в его макете. Проблема в том, что второй уровень не открывается, похоже, что он передал его над ребенком или что-то в этом роде. Вот несколько скриншотов результата:

Вот как это выглядит перед открытием enter image description here

И после открытия первого варианта: (он должен быть пустым)

enter image description here

И теперь откройте второй: (Имеет 4 ребенка и один из них имеет свои собственные дети)

enter image description here

Как вы можете видеть, третий вариант выглядит так, будто ему был предоставлен другой параметр или что-то в нем, после нажатия на его открытие:

enter image description here

Он ничего не делает, кроме изменения состояния стрелки. По крайней мере, он пытается открыть его...

Здесь код:

CatAdapter.java: (расширяет BaseExpandableListAdapter) http://pastebin.com/6yUTkMbJ

Category.java: http://pastebin.com/E7yWwpna

catitem.xml: http://pastebin.com/G5MPT3Ua

Использование: http://pastebin.com/Wk0FqJhn

Извините за длинный вопрос, я старался быть предельно ясным.

Спасибо заранее! Извините за мой плохой английский!

Edit:

Я закончил создание пользовательского представления для этой задачи, спасибо всем за ваши ответы!

4b9b3361

Ответ 1

Я считаю, что проблема в вашем методе getChildView():

    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

            convertView = inflater.inflate(R.layout.catitem, parent, false);
            TextView textView_catName = (TextView)convertView.findViewById(R.id.textView_catName);
            Category current = categories.get(groupPosition).childs.get(childPosition);
            textView_catName.setText(groupPosition + " , " + childPosition);

            if(current.childs.size() > 0 ) {
                    ExpandableListView elv = new ExpandableListView(context);
                    elv.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.WRAP_CONTENT,  AbsListView.LayoutParams.WRAP_CONTENT));
                    elv.setAdapter(new CatAdapter(context, current.childs));
                    ((ViewGroup)convertView).addView(elv);
            }

            return convertView;
    }

Когда вы сталкиваетесь с "расширяемым" ребенком, вы все еще раздуваете R.layout.catitem и добавляете к нему новый elv. Поскольку catitem является RelativeLayout, и вы не добавляете никаких параметров для выравнивания, каждый вид помещается в верхнем левом углу, накладывая все, что еще есть.

Возможно, вы захотите изменить R.layout.catitem, чтобы иметь вертикальный LinearLayout в качестве своего корня. Это должно помешать им накладываться на титул ребенка, но я не могу гарантировать, что дети детей не будут перекрываться. Это легкое изменение, хотя и стоит того.


Кроме того, из документов для ExpandableListView:

Примечание. Вы не можете использовать значение wrap_content для атрибута android: layout_height ExpandableListView в XML, если размер родителя также не определен строго (например, если родительский элемент был ScrollView, вы не можете указать wrap_content, поскольку он также может быть любой длины. Однако вы можете использовать wrap_content, если родитель ExpandableListView имеет определенный размер, например 100 пикселей.

Что говорит "в XML", поэтому я не уверен, что это означает применить к коду или нет. Мне кажется, что они будут использовать один и тот же механизм, поэтому, возможно, стоит заглянуть в него. Я не уверен, как вы собираетесь устанавливать максимальный размер для родителя. Вы можете измерить размер одного элемента и умножить на количество детей. Вы должны учитывать маржи/разделители, поэтому это может быть не просто.


Если это не сработает, вам может потребоваться сворачивать вашу собственную ViewGroup напрямую. Это не должно быть слишком сложно реализовать с нуля, просто не забудьте попытаться использовать пересмотр вида (что ваш текущий метод не делает в любом случае).

Ответ 2

У меня была такая же ситуация, когда мне приходилось использовать ExpandableList, и на каждом уровне мне нужно было иметь groupPosition и childPosition, но используя многоуровневый ExpandableList, было невозможно получить точную groupPosition на данных второго уровня. Поэтому я использовал другой подход. Я дал демо-ссылку, которую я использовал в проекте.

1) В этой библиотеке вам необходимо связать родительское дочернее отношение заранее, прежде чем связывать свои фактические данные. 2) В вашем Layout верхняя часть макета должна быть LinearLayout. Пожалуйста, обратитесь к header.xml, groups.xml и childs.xml в демонстрационную ссылку.

Демо-ссылка: MultiLevelTreeView

Спасибо.