2013-07-21 3 views
10

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

Вот как это выглядеть перед открытием 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:

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

+0

Привет, не возражаете ли вы поделиться куском пользовательского представления, которое вам удалось сделать или, возможно, поделиться с тем, что вы сделали? –

+1

У вас проблема с решением проблемы У меня также такая же проблема stackoverflow.com/questions/18765638/... Если у вас проблема с ур, пожалуйста, помогите мне. – Cropper

+0

Мне удалось решить проблему создания пользовательского представления и реализовать пользовательский OnDraw(). – UnTraDe

ответ

6

Я считаю, что проблема заключается в методе 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 значение для андроида: layout_height атрибут ExpandableListView в XML, если размер родителя также не строго указано (например, если родителем был ScrollView, вы не могли указать wrap_content, поскольку он также может быть любой длины. Однако вы можете использовать wrap_content, если родитель ExpandableListView имеет определенный размер, например 100 пикселей.

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

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

+0

Спасибо большое за ваш ответ! Я попробую то, что вы предложили, и позвольте вам, если это сработает. – UnTraDe

+0

Хорошо, я проверил, что вы предложили с LinearLayout, и это действительно решило мою проблему с перекрывающимися видами. Но теперь я все еще не могу открыть дальше второго уровня (Parent-> Children), как обычно, в ExpandableListView, но я не могу открыть дочерние элементы ребенка. Вы не знаете, как это решить? Заранее спасибо! – UnTraDe

+0

Можете ли вы войти, чтобы узнать, зарегистрирован ли клик?Вам может потребоваться вручную вызвать 'setDescendantFocusability (FOCUS_BLOCK_DESCENDANTS)' для каждого элемента, чтобы позволить клику пройти. ListViews иногда странны в приоритете касания. – Geobits

2

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

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

Demo Ссылка: MultiLevelTreeView

Спасибо.

+0

Я искал «Расширяемый список», который имеет более управляемый код и дает мне все «groupPosition» и «childPosition» точно при нажатии на просмотр. Спасибо, ты сделал мой день. –

+0

Великая библиотека. Один из первых, что я пробовал, работает на более чем трех уровнях. – Goldorak84

+0

@Abhan. Сообщение об ошибке «Заголовок не может быть разрешен или не является полем» в классе «ThreeLevelAdapter» в методе «updateView». –

Смежные вопросы