Как создать раскрывающийся список в навигационном ящике (в Android)?

Я хотел бы иметь возможность создать навигационный ящик с некоторыми расширяемыми, выбираемыми элементами и некоторыми нерасширяемыми элементами. Консенсус на StackOverflow по вопросам, подобным моему, указывает на решения ExpandableListView (которые могут даже не относиться к моей идее). По большей части то, что люди просят, — это способ разделения элементов в Nav Drawer, как это делает приложение GMail с метками, а не то, что я пытаюсь сделать...

... который по существу описан ЗДЕСЬ введите здесь описание изображения

и ТАКЖЕ ЗДЕСЬ (хотя все , а не раскрывающиеся списки) . И не как ЭТОТ ОТВЕТ .


person AlleyOOP    schedule 15.03.2015    source источник


Ответы (2)


Используйте ExpandableListView в DrawerLayout, например:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout2"
android:layout_width="match_parent"
android:layout_height="match_parent">

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv_commentary_behind_nav"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|top"
        android:text="Frame text" />
</FrameLayout>
<!-- The navigation drawer -->
    <ExpandableListView
        android:id="@+id/left_drawer2"
        android:layout_width="250dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="@color/white"
        android:choiceMode="multipleChoice"
        android:dividerHeight="0dp"
        />

</android.support.v4.widget.DrawerLayout>

Затем инициализируйте код следующим образом:

    private DrawerLayout drawer;
    private ExpandableListView drawerList;
    private CheckBox checkBox;
    private ActionBarDrawerToggle actionBarDrawerToggle;


@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.drawer_layout);
        drawer = (DrawerLayout) findViewById(R.id.drawer_layout2);
        drawerList = (ExpandableListView) findViewById(R.id.left_drawer2);
        drawerList.setAdapter(new NewAdapter(this, groupItem, childItem));
    }
person AlleyOOP    schedule 08.07.2015
comment
Что такое groupItem и childItem. Что такое NewAdapter и как он обрабатывает groupItem и childItem, чтобы сделать некоторые элементы расширяемыми? Ваш ответ неполный. - person Ojonugwa Jude Ochalifu; 16.08.2015
comment
groupItem — это массив, содержащий строки для каждого из параметров группы. TopView 2 на рисунке выше. childItem — это матрица/хэш-карта, содержащая список элементов, которые выпадают после выбора каждого из элементов группы. NewAdapter присваивает значения наборов данных groupItem и childItem представлениям, когда он расширяет держатель каждого элемента. - person AlleyOOP; 21.08.2015

У вас должен быть класс, имеющий все реализованные методы ExpandableListAdapter, а также класс ChildItemsInfo и класс GroupItemsInfo, причем MainActivity имеет прослушиватели кликов для группировки элементов и их дочерних элементов.

...а теперь поконкретнее...

Вы можете поместить это в getGroupView() внутри MyExpandableListAdapter класса.

    View ind = convertView.findViewById(R.id.group_indicator);
    View ind2 = convertView.findViewById(R.id.group_indicator2);
    if (ind != null)
    {
        ImageView indicator = (ImageView) ind;
        if (getChildrenCount(groupPosition) == 0)
        {
            indicator.setVisibility(View.INVISIBLE);
        }
        else
        {
            indicator.setVisibility(View.VISIBLE);
            int stateSetIndex = (isExpanded ? 1 : 0);

            /*toggles down button to change upwards when list has expanded*/
            if(stateSetIndex == 1){
                ind.setVisibility(View.INVISIBLE);
                ind2.setVisibility(View.VISIBLE);
                Drawable drawable = indicator.getDrawable();
                drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
            }
            else if(stateSetIndex == 0){
                ind.setVisibility(View.VISIBLE);
                ind2.setVisibility(View.INVISIBLE);
                Drawable drawable = indicator.getDrawable();
                drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
            }
        }
    }

... а что касается макета, вот как выглядит мой group_items.xml

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:id="@+id/group_heading"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="20dp"
    android:paddingTop="16dp"
    android:paddingBottom="16dp"
    android:textSize="15sp"
    android:textStyle="bold"/>

<ImageView
    android:id="@+id/group_indicator"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@android:drawable/arrow_down_float"
    android:layout_alignParentRight="true"
    android:paddingRight="20dp"
    android:paddingTop="20dp"/>

<ImageView
    android:id="@+id/group_indicator2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@android:drawable/arrow_up_float"
    android:layout_alignParentRight="true"
    android:visibility="gone"
    android:paddingRight="20dp"
    android:paddingTop="20dp"/>

Not clear enough?, comment whenever

person keyboard_kracker22    schedule 28.02.2017