ANDROID – ExpandableListView

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

> PARENT1(可检查,可展开)
> CHILD1(RAdio BUTTON)
> CHILD2(RAdio BUTTON)

> PARENT2(可检查,可展开)
> CHILD1(CHECKABLE)
> CHILD2(CHECKABLE)

关键是父母必须可以检查,并且基于孩子必须更改图标.有人可以点我正确的方向,因为我发现什么似乎没有为我工作.

解决方法

我假设你的数据结构有点像,如:
ArrayList其中

> Parent {name:String,checked:boolean,
children:ArrayList}和
> Child {name:String}

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

>为您创建正确的布局
父项目渲染器和子项目
渲染
>将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,ViewGroup parentView)
    {
        final Parent parent = parents.get(groupPosition);
        final Child child = parent.getChildren().get(childPosition);
        convertView = inflater.inflate(R.layout.childrow,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扩展ExpandableListActivity它有一个成员:

private ArrayList<Parent> parents;

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

this.setlistadapter(new MyELAdapter());

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

请注意,背景颜色是在getGroupView方法中确定的,所以您不必在任何地方更改它,只需调用适配器的notifyDataSetChanged()方法即可.

更新

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

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...