ANDROID – ExpandableListView

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

  • PARENT1(可检查,可扩展)
  • CHILD1(电台button)
  • CHILD2(电台button)

  • PARENT2(可检查,可扩展)
  • CHILD1(可检查)
  • CHILD2(可检查)

问题是,父母必须是可检查的,并且基于孩子必须改变图标。 有人可以指出我正确的方向,因为从我发现什么似乎没有为我工作。

我假设,你有你的数据结构以某种方式,如:ArrayList在哪里

  • 父母{名称:string,检查:布尔,子女:ArrayList}和
  • 孩子{name:String}

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

  1. 为您的父项渲染器和子项渲染器创build适当的布局
  2. 展开BaseExpandableListAdapter以自行构build列表。

这是一个关于我脑海中的小样本:
layout / 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> 

layout / 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的内部类,所以我可以直接到达父类的列表,而不必将其作为parameter passing。

 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()); 

就是这样。 你有一个checkable- onCheckedChanged(CompoundButton buttonView, boolean isChecked)列表,并且在CheckUpdateListeneronCheckedChanged(CompoundButton buttonView, boolean isChecked)方法中你可以更新你的父对象的checked状态。

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

更新

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