ANDROID - ExpandableListView - PullRequest
       20

ANDROID - ExpandableListView

9 голосов
/ 13 апреля 2011

Я пытаюсь выяснить, как построить представление, которое содержит (многие из):

  • PARENT1 (проверяемый, расширяемый)
  • РЕБЕНОК 1 (КНОПКА РАДИО)
  • РЕБЕНОК 2 (КНОПКА РАДИО)

...

  • PARENT2 (проверяемый, расширяемый)
  • РЕБЕНОК1 (ПРОВЕРЕНО)
  • РЕБЕНОК2 (ПРОВЕРЕНО)

...

Суть в том, что родитель должен быть проверяемым и исходя из того, что дети должны изменить значок. Может ли кто-нибудь указать мне правильное направление, потому что из того, что я нашел, мне кажется, ничего не работает.

1 Ответ

17 голосов
/ 13 апреля 2011

Полагаю, у вас как-то структурированы данные, например: ArrayList где

  • Parent {name: String, проверено: boolean, children: ArrayList} и
  • Child {name: String}

Если это так, вам нужно сделать только две вещи:

  1. создать правильные макеты для вашего средства визуализации родительского элемента и средства визуализации дочернего элемента
  2. разверните 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).

...