Android中的多级ExpandableListView

时间:2013-07-21 12:28:29

标签: java android expandablelistview

我试图从给定的未知大小和级别的类别列表中创建一个类别树。所以我试图创建一个可以包含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

很抱歉这个问题很长,我试图尽可能清楚。

提前致谢!抱歉我的英文不好!

修改

我最终为此任务制作了自定义视图,谢谢大家的答案!

2 个答案:

答案 0 :(得分:7)

我认为问题出在您的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。由于catitemRelativeLayout,并且您没有为对齐添加任何参数,因此每个视图都放在左上角,覆盖其他任何内容。

您可以尝试更改R.layout.catitem以使其垂直LinearLayout为根。这可以防止他们重叠孩子的头衔,但我不能保证孩子的孩子不会重叠。不过,这是一个简单的改变,值得一试。


另外,来自ExpandableListView的文档:

  

注意:如果父级的大小也没有严格指定,则不能将值wrap_content用于XML中ExpandableListView的android:layout_height属性(例如,如果父级是ScrollView,则无法指定wrap_content,因为它也可以是任何长度。但是,如果ExpandableListView父级具有特定大小(例如100像素),则可以使用wrap_content。

那说“在XML中”,所以我不确定它是否意味着应用于代码。在我看来,他们使用相同的机制,所以它可能值得研究。我不确定你如何设置父母的最大尺寸。您可以测量一个项目的大小,并乘以子项数。您必须考虑边距/分隔符,因此可能并不简单。


如果这不起作用,您可能需要直接滚动自己的ViewGroup。从头开始实现它应该不会太难,只是不要忘记尝试利用视图回收(当前的方法不会这样做)。

答案 1 :(得分:2)

我遇到同样的情况,我必须使用ExpandableList,并且在每个级别我需要groupPositionchildPosition但是使用多级ExpandableList,它是无法在二级数据中获得准确的groupPosition。所以,我使用了另一种方法。我给出了一个我在项目中使用的演示链接。

1)在此库中,您需要在绑定实际数据之前提前绑定父子关系。 2)在Layout中,最顶层的布局必须为LinearLayout.。请在演示链接中引用header.xmlgroups.xmlchilds.xml

演示链接:MultiLevelTreeView

感谢。