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

Как реализовать ящик для навигации Android как это?

TopLevelView1 ~ TopLevelView4 может выбирать, а детей нет
TopVevelView5 может collaspe

Мой вопрос в том, что если моя групповая структура похожа на это, например

Все
Уставился
Категория
---- mp3 | ---- TXT
---- док
---- PDF

когда я выбираю все, а затем показываю весь файл.

когда я выбираю stared, тогда показывается только файл stared.

когда я выбираю mp3, тогда показываю только mp3 файлы.

и Категория может расширяться и сворачиваться.

https://developer.android.com/design/media/navigation_drawer_collapse.png

Ответ 1

Для навигации:

  • Альтернатива 1:

    Скользящее меню, с которым я обязательно поеду. Даже используется популярным приложением, таким как LinkedIn и Foursquare, и легко реализуется и используется. Полное объяснение и примеры исходных кодов: SlidingMenu - GitHub

  • Альтернатива 2:

    Android-навигатор. Если вы хотите полностью настроить все самостоятельно без использования каких-либо библиотек, это ваш вариант. Вы можете проверить коды и как это сделать на веб-сайте Android Developers: Создание ящика навигации

Просмотр в вашем навигационном ящике/скользящем меню:

  • Альтернатива 1:

    Android по умолчанию ExpandableListView. Ссылки: Android-разработчики, androidhive

  • Альтернатива 2:

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

Ответ 2

Попробуйте что-нибудь подобное

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/drawer_list_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start" >

        <ExpandableListView
            android:id="@+id/drawer_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"/>
    </FrameLayout>
</android.support.v4.widget.DrawerLayout>

Код Java:

drawerListView.setAdapter(new ExpandableListAdapter() {

            @Override
            public void unregisterDataSetObserver(DataSetObserver observer) {
                // TODO Auto-generated method stub

            }

            @Override
            public void registerDataSetObserver(DataSetObserver observer) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGroupExpanded(int groupPosition) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onGroupCollapsed(int groupPosition) {
                // TODO Auto-generated method stub

            }

            @Override
            public boolean isEmpty() {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public boolean isChildSelectable(int groupPosition, int childPosition) {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public boolean hasStableIds() {
                // TODO Auto-generated method stub
                return true;
            }

            @Override
            public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub
                TextView view = new TextView(getApplicationContext());
                view.setText("group " + groupPosition);
                return view;
            }

            @Override
            public long getGroupId(int groupPosition) {
                // TODO Auto-generated method stub
                return groupPosition;
            }

            @Override
            public int getGroupCount() {
                // TODO Auto-generated method stub
                return 5;
            }

            @Override
            public Object getGroup(int groupPosition) {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public long getCombinedGroupId(long groupId) {
                // TODO Auto-generated method stub
                return 0;
            }

            @Override
            public long getCombinedChildId(long groupId, long childId) {
                // TODO Auto-generated method stub
                return 0;
            }

            @Override
            public int getChildrenCount(int groupPosition) {
                // TODO Auto-generated method stub
                return 5;
            }

            @Override
            public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
                    ViewGroup parent) {
                TextView view = new TextView(getApplicationContext());
                view.setText("child " + groupPosition);
                return view;
            }

            @Override
            public long getChildId(int groupPosition, int childPosition) {
                // TODO Auto-generated method stub
                return childPosition ;
            }

            @Override
            public Object getChild(int groupPosition, int childPosition) {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public boolean areAllItemsEnabled() {
                // TODO Auto-generated method stub
                return false;
            }
        });