【问题标题】:Multi-level ExpandableListView in AndroidAndroid中的多级ExpandableListView
【发布时间】:2013-07-21 12:28:28
【问题描述】:

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

对不起,这个问题太长了,我尽量说清楚。

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

编辑:

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

【问题讨论】:

  • 嗨,您介意分享您设法制作或可能分享的自定义视图片段吗?
  • 你解决了你的问题我也有同样的问题 stackoverflow.com/questions/18765638/... 如果你解决了你的问题,请帮助我。
  • 我已经设法解决了创建自定义视图并实现自定义 OnDraw() 的问题。
  • 你能更新你的自定义视图代码和/或解释一下你的解决方案吗?我有点绝望。我遗漏了一些东西,因为我的 3 级可扩展列表视图无法按预期工作。我在 getChild 中膨胀的第二个列表行与父级不匹配,在单击任何节点时我也遇到了一些麻烦......提前非常感谢!
  • 我很久以前丢失了这段代码,抱歉。但基本上你只需要实现自己的自定义视图并通过覆盖 onDraw() 来绘制所有内容,你可以在 android 官方文档中阅读它。

标签: java android expandablelistview


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

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


另外,来自ExpandableListView 的文档:

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

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


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

【讨论】:

  • 非常感谢您的回答!我会尝试你的建议,如果可行,我会告诉你的。
  • 好的,我用 LinearLayout 测试了你的建议,它确实解决了我的重叠视图问题。但是现在我仍然无法在 ExpandableListView 中像往常一样打开第二级(父母->孩子),但我无法打开孩子的孩子。你知道如何解决这个问题吗?提前致谢!
  • 你能登录看看点击是否被注册了吗?您可能需要在每个项目上手动调用 setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS) 以允许点击通过。 ListViews 有时对触摸优先级很奇怪。
【解决方案2】:

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

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

演示链接:MultiLevelTreeView

谢谢。

【讨论】:

  • 我在寻找Expandable List,它有更易于管理的代码,并在点击视图时准确地为我提供所有groupPositionchildPosition。谢谢,你让我开心。
  • 很棒的图书馆。我尝试过的第一个在三个以上级别上都可以使用
  • @Abhan 在方法 ThreeLevelAdapter 类中存在错误消息 Header cannot be resolved or is not a field updateView
  • @Gödel77 对于布局,根视图必须是线性布局。第二件事根据您的要求,您需要在getNewChildView 方法中指定布局并在updateView 中初始化您的视图。为了更好地理解运行演示或调试。
  • 对不起,我需要一个提示处理第三级的复选框。有没有我必须重写的方法?
猜你喜欢
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多