Как поместить ExpandableListView в меню вместе с обычными пунктами меню на Android? - PullRequest
0 голосов
/ 03 ноября 2018

Я использую DrawerLayout в своем приложении для Android, которое работает нормально, но у меня возникают проблемы с самим меню, где я хочу иметь разборный раздел и некоторые статические элементы в меню.

Точная компоновка, которую я хочу достичь, выглядит следующим образом:

Drawer Title

-> Expandable List
Menu Item 1
Menu Item 2

И когда список Расширяемый открыт, чтобы иметь что-то вроде этого:

Drawer Title

-> Expandable List
   Expandable List Item 1
   Expandable List Item 2
Menu Item 1
Menu Item 2

Проблема, с которой я столкнулся, заключается в том, что меню, кажется, не сидит в потоке представления, как другие элементы, поэтому, если у меня есть ExpandableListView внутри NavigationView, который содержит меню, оно открывается поверх другие пункты меню, и, кажется, нет способа их переместить.

Чтобы попытаться решить эту проблему, я переместил ExpandableListView в отдельный макет, который обеспечивает заголовок для меню. Теперь все правильно рисует , но Я больше не могу открыть представление списка, что, безусловно, является проблемой. На самом деле он открывается - или, по крайней мере, onGroupExpandListener срабатывает - но, хотя высота заголовка установлена ​​на wrap_content и I invalidate при развертывании и свертывании, размер заголовка остается неизменным. Чтобы обойти это, я вручную изменяю его размер в onGroupExpandListener и onGroupCollapseListener следующим образом.

В моем макете у меня есть NavigationView, как это:

 <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:menu="@menu/drawer_view" >

 </android.support.design.widget.NavigationView>

Заголовок выглядит так:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
        <RelativeLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="70dp"
            android:background="@color/colorPrimary" >
                <ImageView
                    android:layout_width="70dp"
                    android:layout_height="70dp"
                    android:padding="10dp"
                    app:srcCompat="@drawable/main_icon" />

                <TextView
                    android:id="@+id/drawer_header"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentStart="true"
                    android:layout_centerVertical="true"
                    android:layout_gravity="left|start|center"
                    android:layout_marginStart="70dp"
                    android:paddingStart="5pt"
                    android:text="Options"
                    android:textColor="#FFFFFF"
                    android:textSize="16pt"
                    android:textStyle="bold" />
        </RelativeLayout>
        <ExpandableListView
            android:id="@+id/menu_expandable_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom" >
        </ExpandableListView>
</LinearLayout>

В моем коде я сейчас настраиваю ExpandableListView (в комплекте с кучей лишних хаков, потому что я пытаюсь выяснить проблему) следующим образом:

private void setOptionsMenuItems(final NavigationView menuContainer) {
    final View v = menuContainer.inflateHeaderView(R.layout.drawer_header);
    final ExpandableListView optionsMenu = (ExpandableListView) v.findViewById(R.id.menu_expandable_list);
    final MyExpandableListAdapter adapter = new MyExpandableListAdapter(this, allTheItems );
    optionsMenu.setAdapter(adapter);
    optionsMenu.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
        @Override
        public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
            setCurrentItem(allTheItems[childPosition]);
            return true;
        }
    });

    optionsMenu.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
        @Override
        public void onGroupExpand(int groupPosition) {
            v.setMinimumHeight(v.getChildAt(0).getHeight() + adapter.getOpenHeight());
            v.invalidate();
        }
    });
    optionsMenu.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
        @Override
        public void onGroupCollapse(int groupPosition) {
            v.setMinimumHeight(v.getChildAt(0).getHeight() +  adapter.getClosedHeight());
            v.invalidate();
        }
    });
}

Эта версия кода правильно расширяет и сжимает заголовок при открытии или закрытии группы (adapter.getOpenHeight()/getClosedHeight() дает размерность, которую вы ожидаете), но фактические дочерние элементы никогда не отображаются. То же самое увеличение в onGroupClickListener ничем не отличается, хотя я подозреваю, что дочерние элементы отбираются из вида, потому что система макетов предполагает, что они невидимы, а не изменяются размеры представления. Если я вручную сделаю заголовок выше, чтобы все было видно, когда ExpandableList развернут, он открывается и закрывается как обычно, но, очевидно, это не позволяет мне перемещать другие пункты меню вверх и вниз, что и составляет весь смысл.

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

Что мне нужно сделать, чтобы в моем меню был рабочий свернутый список опций?

Редактировать: По прошествии еще некоторого времени происходит то, что список обходится при рисовании новых разделов, потому что он определил, что для них нет видимого места - хотя изменение размера может быть вызвано из onGroupClickListener фактическое изменение видимого размера не произойдет до следующего прохода чертежа, поэтому, когда базовый ListView проверяет, есть ли место для записи списка, он становится ложным.

1 Ответ

0 голосов
/ 10 ноября 2018

Я не нашел способа сделать это с помощью обычного меню - вместо этого я решил добавить другие пункты меню в виде ExpandableListView групп, чтобы они просто отображались на верхнем уровне представления списка. Это позволило мне создать эффект, который я искал, за счет отказа от использования «правильного» меню.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...