Ответ 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 напрямую. Это не должно быть слишком сложно реализовать с нуля, просто не забудьте попытаться использовать пересмотр вида (что ваш текущий метод не делает в любом случае).