首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANDROID - ExpandableListView

ANDROID - ExpandableListView
EN

Stack Overflow用户
提问于 2011-04-13 06:10:34
回答 1查看 12.4K关注 0票数 9

我试图找出如何构建一个包含(许多)的视图:

  • PARENT1 (可校验,可扩展)
  • CHILD1 (单选按钮)
  • CHILD2 (单选按钮)

..。

  • PARENT2 (可校验,可扩展)
  • CHILD1 (支票)
  • CHILD2 (支票)

..。

关键是家长必须是可检查的,并且基于此,孩子必须改变图标。some1能为我指明正确的方向吗?因为从我所发现的情况看,似乎没有什么对我有用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-13 07:05:18

我想,您的数据在某种程度上是结构化的,比如: ArrayList

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

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

  1. 为父项呈现器和子项呈现器创建正确的布局。
  2. 展开BaseExpandableListAdapter,自己构建列表。

下面是一个关于我脑子里的东西的小样本:

layout/grouprow.xml

代码语言:javascript
复制
<?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>

layout/childrow.xml

代码语言:javascript
复制
<?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的内部类,这样我就可以直接到达父母列表,而不必将其作为参数传递。

代码语言:javascript
复制
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,它有一个成员:

代码语言:javascript
复制
private ArrayList<Parent> parents;

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

代码语言:javascript
复制
this.setListAdapter(new MyELAdapter());

仅此而已。您有一个可检查的可扩展列表,在CheckUpdateListeneronCheckedChanged(CompoundButton buttonView, boolean isChecked)方法中,您可以更新父对象的选中状态。

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

更新

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

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5645104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档