10

我正在尝试从给定的未知大小或级别的类别列表创建类别树。所以我正在尝试创建一个可以包含 2+ 个级别的通用可扩展列表。一般的想法是在其布局中添加另一个 ExpandableListView 到每个有孩子的孩子。问题是第二层打不开,看起来它把它渲染到了孩子或其他东西上。这是结果的一些屏幕截图:

这是打开前的样子在此处输入图像描述

打开第一个选项后:(它应该是空的)

在此处输入图像描述

现在打开第二个:(有 4 个孩子,其中一个有自己的孩子)

在此处输入图像描述

正如您所看到的,在单击打开它之后,第三个选项看起来像是呈现了另一个选项或其他东西:

在此处输入图像描述

除了改变箭头的状态之外,它什么也不做。至少它试图打开它......

这是代码:

CatAdapter.java:(扩展 BaseExpandableListAdapter) http://pastebin.com/6yUTkMbJ

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

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

用法: http: //pastebin.com/Wk0FqJhn

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

提前致谢!对不起,我的英语不好!

编辑:

我最终为这个任务制作了一个自定义视图,谢谢大家的回答!

4

2 回答 2

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。由于catitem是 aRelativeLayout并且您没有添加任何对齐参数,因此每个视图都放置在左上角,覆盖那里的任何其他内容。

您可能想尝试更改R.layout.catitem以将垂直LinearLayout作为其根。这应该可以防止他们重叠孩子的标题,但我不能保证孩子的孩子仍然不会重叠。不过,这是一个简单的改变,值得一试。


此外,来自文档ExpandableListView

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

那就是“在 XML 中”,所以我不确定这是否意味着适用于代码。在我看来,他们会使用相同的机制,因此可能值得研究。我不确定您将如何为父母设置最大尺寸。您也许可以测量一件物品的大小,然后乘以孩子的数量。您必须考虑边距/分隔符,所以它可能并不简单。


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

于 2013-07-24T18:27:36.240 回答
2

我有同样的情况,我必须使用ExpandableList,并且在每个级别我都需要groupPositionchildPosition但是使用 multi-level ExpandableList,不可能groupPosition在二级数据上获得准确的数据。所以,我使用了另一种方法。我已经给出了我在项目中使用的演示链接。

1)在这个库中,在绑定实际数据之前,需要提前绑定父子关系。2)在你的Layout,最上面的布局必须是LinearLayout.请参考header.xmlgroups.xml并且childs.xml在演示链接中。

演示链接:MultiLevelTreeView

谢谢。

于 2013-07-25T15:06:45.290 回答