ANDROID - ExpandableListView

2023-12-05

我试图弄清楚如何构建一个包含(许多)的视图:

  • PARENT1(可勾选、可扩展)
  • 子级 1(单选按钮)
  • 子级 2(单选按钮)

...

  • PARENT2(可勾选、可扩展)
  • 儿童 1(可勾选)
  • 儿童2(可勾选)

...

要点是父级必须是可检查的,并且子级必须更改图标。有人可以指出我正确的方向吗,因为从我发现的情况来看,似乎没有什么对我有用。


我假设,您的数据以某种方式结构化,例如: 数组列表在哪里

  • 父级 {名称:字符串,选中:布尔值, 孩子:ArrayList} 和
  • 孩子{名称:字符串}

如果是这样,你只需要做两件事:

  1. 为您创建合适的布局 父项渲染器和子项 渲染器
  2. 将 BaseExpandableListAdapter 扩展为 自己建立清单。

以下是我的想法的一个小样本:
布局/grouprow.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:orientation="horizontal"
    android:gravity="fill" android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- PARENT -->
    <TextView android:id="@+id/parentname" android:paddingLeft="5px"
        android:paddingRight="5px" android:paddingTop="3px"
        android:paddingBottom="3px" android:textStyle="bold" android:textSize="18px"
        android:layout_gravity="fill_horizontal" android:gravity="left"
        android:layout_height="wrap_content" android:layout_width="wrap_content" />
    <CheckBox android:id="@+id/checkbox" android:focusable="false" 
        android:layout_alignParentRight="true" android:freezesText="false"
        android:layout_width="wrap_content" android:layout_height="wrap_content" 
        android:layout_marginTop="5px" />
</RelativeLayout>

布局/childrow.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="wrap_content" android:padding="0px">
    <!-- CHILD -->
    <TextView android:id="@+id/childname" android:paddingLeft="15px" 
        android:paddingRight="5px" android:focusable="false" android:textSize="14px"
        android:layout_marginLeft="10px" android:layout_marginRight="3px" 
        android:layout_width="fill_parent" android:layout_height="wrap_content" />
</LinearLayout>

MyELAdapter 类:我已将其声明为 MyExpandableList 的内部类,因此我可以直接访问父级列表,而无需将其作为参数传递。

private class MyELAdapter extends BaseExpandableListAdapter
{
    private LayoutInflater inflater;

    public MyELAdapter()
    {
        inflater = LayoutInflater.from(MyExpandableList.this);
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, 
            View convertView, ViewGroup parentView)
    {
        final Parent parent = parents.get(groupPosition);
        convertView = inflater.inflate(R.layout.grouprow, parentView, false);
        ((TextView) convertView.findViewById(R.id.parentname)).setText(parent.getName());
        CheckBox checkbox = (CheckBox) convertView.findViewById(R.id.checkbox);
        checkbox.setChecked(parent.isChecked());
        checkbox.setOnCheckedChangeListener(new CheckUpdateListener(parent));
        if (parent.isChecked())
            convertView.setBackgroundResource(R.color.red);
        else
            convertView.setBackgroundResource(R.color.blue);
        return convertView;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, 
            View convertView, ViewGroup parentView)
    {
        final Parent parent = parents.get(groupPosition);
        final Child child = parent.getChildren().get(childPosition);
        convertView = inflater.inflate(R.layout.childrow, parentView, false);
        ((TextView) convertView.findViewById(R.id.childname)).setText(child.getName());
        return convertView;
    }

    @Override
    public Object getChild(int groupPosition, int childPosition)
    {
        return parents.get(groupPosition).getChildren().get(childPosition);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition)
    {
        return childPosition;
    }

    @Override
    public int getChildrenCount(int groupPosition)
    {
        return parents.get(groupPosition).getChildren().size();
    }

    @Override
    public Object getGroup(int groupPosition)
    {
        return parents.get(groupPosition);
    }

    @Override
    public int getGroupCount()
    {
        return parents.size();
    }

    @Override
    public long getGroupId(int groupPosition)
    {
        return groupPosition;
    }

    @Override
    public void notifyDataSetChanged()
    {
        super.notifyDataSetChanged();
    }

    @Override
    public boolean isEmpty()
    {
        return ((parents == null) || parents.isEmpty());
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition)
    {
        return true;
    }

    @Override
    public boolean hasStableIds()
    {
        return true;
    }

    @Override
    public boolean areAllItemsEnabled()
    {
        return true;
    }
}

您必须已经上过公开课MyExpandableList extends ExpandableListActivity其中有一个成员:

private ArrayList<Parent> parents;

为该成员分配值/加载父级列表后,您还应该将适配器附加到该视图:

this.setListAdapter(new MyELAdapter());

就是这样。您有一个可检查可扩展的列表,并且在CheckUpdateListener's onCheckedChanged(CompoundButton buttonView, boolean isChecked)方法您可以更新父对象的选中状态。

请注意,背景颜色是在 getGroupView 方法中确定的,因此您不必在任何地方更改它,只需调用适配器的notifyDataSetChanged()方法(如果需要的话)。

Update

您可以从以下位置下载示例源代码这个链接。这是一个eclipse项目,但如果您使用其他开发环境,只需简单地复制必要的源文件(java + xml)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ANDROID - ExpandableListView 的相关文章

随机推荐

  • 在没有jquery的情况下更改页面滚动时的背景颜色?

    我试图让过渡工作 以便背景颜色根据页面 即位置淡入另一种颜色 由具有相同类的div触发 在这里找到了一些js http codepen io Funsella pen yLfAG 它在桌面上完全按照我想要的方式工作 但它在 iPad 上崩溃
  • Parallel.ForEach 与 HttpClient 和 ContinuousWith

    我有一个方法尝试从多个 URL 并行下载数据 并返回一个IEnumerable反序列化类型 该方法如下所示 public IEnumerable
  • 如何更改python字符串中最后一个字母的大小写?

    所以我想将字符串中的最后一个字符更改为小写 下面的代码是我用来向后打印字符串的方法 但是列表将最后一个字符保留为大写 我不知道如何解决这个问题 if s 1 x new last index len s 1 for i in range l
  • 插入符中的逻辑回归 - 无截距?

    使用 caret 包在 R 中执行逻辑回归 并尝试强制零截距 使得 x 0 处的概率为 0 5 在其他形式的回归中 似乎您可以使用unegrid关闭截距 但这没有逻辑回归的功能 有任何想法吗 model lt train y 0 x dat
  • 将wpf窗口打印到pdf文件

    我需要从 wpf 窗口构建 pdf 文件 该窗口包含一个带有一些绘图的画布以及一些带有数据的文本框和标签 一位朋友告诉我使用水晶报表 但对我来说似乎不是一个好的解决方案 我想在画布上打印图像并用文本框和标签的数据写入一些行 我需要一个非付费
  • 独立 VS 2010 C++ 程序

    我已经很久没有使用 VS 2010 和 C 了 当我重新开始使用它时 我遇到了去年困扰我的同样的问题 我编译的 exe 运行得不好没有正确的 C 运行时的旧机器 我什至不知道给他们什么链接 我告诉他们安装this他们收到错误消息 该程序无法
  • 如何在 AEM 6.1 中创建系统用户 (rep:SystemUser)?

    在 AEM 6 1 上 我尝试创建一个系统用户 rep SystemUser 谁能帮我 我需要这个系统用户映射到 OSGI 中的一个服务 我想用它来将一些数据写入 aem 内容 我可以在 CRX 中的以下位置看到 系统用户 home use
  • 在 C'# 中以编程方式获取所有 TFS 分支

    我正在尝试以编程方式获取 TFS for Visual Studio 2013 中所有分支的列表 经过一些研究 我发现此博客详细介绍了如何获取分支 显示 TFS 2010 中的所有分支层次结构 我修改了代码 将所有内容存储在列表中 priv
  • MPICH:如何发布_名称以便客户端应用程序可以查找_名称?

    在 Windows 1 4 1p1 中使用 MPICH 学习 MPI 时 我发现了一些示例代码here 最初 当我运行服务器时 我必须复制生成的port name并用它启动客户端 这样 客户端就可以连接到服务器了 我修改它以包括MPI Pu
  • 魔法记录导入(下一步)

    我在标题中添加了下一步 因为这与我之前的问题不同 标题几乎完全相同 我有一个Person entity Person name mappedKeyName FullName email mappedKeyName EmailAddress
  • 每天在两列范围之间的数据框中添加行

    我需要知道按房型划分的预订数量 我有这个 DataFrame 其中包含每个预订的开始和结束及其房间类型 date from date to room type 0 2017 08 07 2017 08 12 SUI 1 2017 08 09
  • 为什么 Xcode 4.3.2 存档时会挂起?

    当我尝试归档构建时 xcode 因彩色旋转死亡之轮而挂起 它曾经工作正常 但我无法再浏览存档 除非我手动删除存档文件 不过 我可以毫无问题地构建一个设备 我手动删除了存档中的所有内容 通过删除实际的存档文件 并且存档 组织器窗格显示正常 因
  • 提供的注册令牌未注册

    我正在尝试通过 Google 云功能发送 iOS 推送通知 但它返回错误The provided registration token is not registered 但我已经通过调试我的应用程序进行了检查 并且 FCM 注册令牌是正确
  • MySQL:选择前n个最大值?

    我对需要返回特定列上具有最大值的前 N 行的查询感到非常困惑 例如 如果行N 1 N N 1具有相同的值 我必须返回吗just top N or top N 1 rows 如果你这样做 select from t order by valu
  • 渲染透明外壳

    假设我正在渲染神奇女侠驾驶她的隐形喷气机 射流由多个网格组成 大部分是透明的 在透明网格重叠的地方 它变得更加不透明 我不想有这种重叠 这样透明部分仍然有阴影 但材质会丢弃其他片段后面的透明片段 就好像神奇女侠坐在透明的外壳内一样 也许一个
  • 下载并使用现代 CMake 构建 Lua

    让我们尝试通过 cmake 构建 lua 动机 cmake 通过 CLion 等 IDE 获得更多关注和支持or甚至视觉 Studio 2017 及更新版本 如果您想提供独立于平台的开源并促进整个构建过程 那么这非常有用 现在的问题是创建一
  • 如何在 Angular 中定义枚举类型以不违反 tslint typedef 规则

    为了能够在模板中使用枚举 我们在 ts 文件中编写以下代码 在工作流程Progress ts中 export enum WorkflowProgress cancelled 0 inProgress done 在组件 ts中 export
  • python中numpy多维数组的非相邻切片

    我有一个多维数组 a a np random uniform 1 10 2 4 2 3 10 10 对于维度 4 6 我有 3 个列表 其中包含用于切片数组 a 的该维度的索引 dim4 0 2 dim5 3 5 9 dim6 1 2 7
  • 打印所有对 n 个整数求和的方法,使它们的总和达到给定的和。

    我正在尝试提出一种算法 该算法将打印出对 N 个整数求和的所有可能方法 以便它们总计达到给定值 例子 打印所有对 4 个整数求和的方法 使它们的总和为 5 结果应该是这样的 5 0 0 0 4 1 0 0 3 2 0 0 3 1 1 0 2
  • ANDROID - ExpandableListView

    我试图弄清楚如何构建一个包含 许多 的视图 PARENT1 可勾选 可扩展 子级 1 单选按钮 子级 2 单选按钮 PARENT2 可勾选 可扩展 儿童 1 可勾选 儿童2 可勾选 要点是父级必须是可检查的 并且子级必须更改图标 有人可以指