Android ExpandableListView,具有项目的自定义复杂布局

时间:2016-05-14 15:39:06

标签: android android-layout user-experience

我正在开发一个Android应用程序,而且我遇到了一个我想要实现的复杂布局层次结构的墙。该应用程序将列出咖啡店的菜单。截至目前,菜单如下所示:

enter image description here

该列表实现为RecyclerView。视图的自定义适配器负责每个元素的操作。触摸元素会增加订单价格,并将所选元素的总数加1。您也可以单击该数字以获取提取对话框并更改金额。

你可以想象那里有很多代码。

这是我想要实施的理论布局:

enter image description here

我专注于内心ExpandableListView。基本上我想按食物,饮料等对菜单项进行分类。

我遇到的问题是我不知道如何保留项目布局的“复杂性”。我设法创建了一个只有项目名称的简单ExpandableListView,如下所示:

enter image description here

但我真的不知道如何使用我为ExpandableListView中的先前布局创建的项目适配器。不幸的是我不能分享很多代码,但我不是要求代码片段,而是更多关于我如何实现这个,想法,提示的方向...这是我的第一个Android应用程序: - )

非常感谢任何帮助。

非常感谢!

1 个答案:

答案 0 :(得分:3)

好吧,我找到了解决问题的方法,在一天结束时并没有那么复杂。我会尝试总结,以防有人遇到同样的情况。

首先,您必须为ExpandableListView创建自定义适配器。我的上一个RecyclerView确实有一个自定义适配器,它使用了ViewHolder模式,这让我感到困惑。

This示例实际上对于了解如何实现自定义适配器非常有用。覆盖的重要方法是getChildView。在该方法中,构建了整个子视图。

@Override
public View getChildView(int listPosition, final int expandedListPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {
        final MenuItem item = (MenuItem) getChild(listPosition, expandedListPosition);

        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.menu_item, null);
        }

        // Save final reference to be able to access it in inner classes
        final View finalConvertView = convertView;

        // Set the item name
        TextView itemName = (TextView) convertView.findViewById(R.id.item_menu_name);
        itemName.setText(item.getName());

        // Set item price
        TextView itemPrice = (TextView) convertView.findViewById(R.id.item_menu_price);
        itemPrice.setText(item.getFormattedPrice());

这不是完整的代码,但您可以看到它只是在menu_item.xml布局中获取视图并填充它们的问题: - )

在我使用Android data bingind之前,但我不知道在没有ViewHolder的情况下如何使用它。