> 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)即可.