Полагаю, у вас как-то структурированы данные, например: ArrayList где
- Parent {name: String, проверено: boolean, children: ArrayList} и
- Child {name: String}
Если это так, вам нужно сделать только две вещи:
- создать правильные макеты для вашего средства визуализации родительского элемента и средства визуализации дочернего элемента
- разверните BaseExpandableListAdapter, чтобы составить список самостоятельно.
Вот небольшой пример того, что у меня на уме: 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, так что я мог напрямую обращаться к списку родителей, не передавая его в качестве параметра.
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
onCheckedChanged(CompoundButton buttonView, boolean isChecked)
вы можете обновить проверенное состояние вашего родительского объекта.
Обратите внимание, что цвет фона определяется в методе getGroupView, поэтому вам не нужно его нигде менять, просто при необходимости вызовите метод notifyDataSetChanged()
адаптера.
Обновление
Вы можете загрузить образец исходного кода с по этой ссылке .Это проект затмения, но если вы используете другую среду разработчика, просто скопируйте необходимые исходные файлы (java + xml).