Добавление нескольких представлений в NavigationDrawer

Я работаю над NavigationDrawer, у которого FrameLayout является первым дочерним элементом, а ListView - вторым. Я успешно заполнил список элементов, которые мне нужны программно. Теперь хочу немного модификаций. Я хочу, чтобы внутри панели навигации был заполнен еще один список, но я хочу, чтобы он был выровнен по нижнему краю. Я посмотрел на пару примеров, но не смог заставить его работать. Можете ли вы сказать мне, как я могу заставить его работать? Вот мой основной макет навигации (activity_navigation.xml)

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    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" />

        <ListView
            android:id="@+id/left_drawer"
            android:layout_width="@dimen/navigation_drawer_width"
            android:layout_height="match_parent"
            android:background="#111"
            android:layout_gravity="start"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp" />
</android.support.v4.widget.DrawerLayout>

Мой индивидуальный файл списка (listview_item_row.xml)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/navigation_drawer_list_item_selector"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
    android:padding="10dp" >

    <ImageView
        android:id="@+id/imageViewIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:paddingRight="10dp" />

    <TextView
        android:id="@+id/textViewName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/imageViewIcon"
        android:paddingRight="10dp"
        android:textAppearance="?android:attr/textAppearanceListItemSmall"
        android:textColor="#ffffff" />

</RelativeLayout>

В моем классе активности я программно устанавливаю макет следующим образом:

mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);

ObjectDrawerItem[] drawerItem = new ObjectDrawerItem[3];
drawerItem[0] = new ObjectDrawerItem(R.drawable.ic_speedometer, mNavigationDrawerItemTitles[0]);
drawerItem[1] = new ObjectDrawerItem(R.drawable.ic_place, mNavigationDrawerItemTitles[1]);
drawerItem[2] = new ObjectDrawerItem(R.drawable.ic_price, mNavigationDrawerItemTitles[2]);

DrawerItemCustomAdapter adapter = new DrawerItemCustomAdapter(this, R.layout.listview_item_row, drawerItem);
mDrawerList.setAdapter(adapter);        
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

Как я могу создать другой список точно так же, как я создаю текущий? Я хочу, чтобы это выглядело так: введите здесь описание изображения(картинка взята с этот вопрос)

Что-то новое в мире Android. Заранее спасибо. Обновление: мне удалось вложить свой ListView в LinearLayout, а затем создать еще один ListView внутри этого LinearLayout. Теперь, как мне назначить элементы ListView нижнему контроллеру ListView?


person Basit    schedule 02.08.2014    source источник


Ответы (1)


Используйте RelativeLayout для своего ящика, а не сам ListView, вставьте туда свое представление списка, выровненное по верхней части, а затем вставьте другой ListView, назначенный внизу.

Например:

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

<RelativeLayout
    android:id="@+id/left_drawer"
    android:layout_width="@dimen/navigation_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="#111" >

    <ListView
        android:id="@+id/top_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParent_left="true"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp" />

    <ListView
        android:id="@+id/bottom_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParent_left="true"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp" />

person Larry Schiefer    schedule 02.08.2014
comment
Сделал это. Но когда я передал ListView mDrawerList = (ListView) findViewById(R.id.left_drawer);, я получил исключение приведения. - person Basit; 02.08.2014
comment
Если вам нужно увидеть код, чтобы понять исключение, этот подход действительно работает. - person Larry Schiefer; 02.08.2014
comment
Я получил LinearLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams, когда добавил RelativeLayout в качестве родителя ListView и в этом макете добавил еще один RelativeLayout с android:layout_alignParentBottom="true" - person Basit; 02.08.2014
comment
Не могли бы вы предоставить образец макета XML с вашим решением? И как я могу добавить это в ящик, не вызывая исключений? - person Basit; 02.08.2014
comment
Проверьте идентификатор представления, который вы назначили списку. Похоже, вы (правильно) назвали новый относительный макет R.id.left_drawer, но вы извлекаете его в виде списка. Вам нужно будет получить список, используя правильный идентификатор. - person Larry Schiefer; 02.08.2014
comment
Но left_drawer — это ListView. - person Basit; 02.08.2014
comment
Я думаю, вы упускаете то, о чем я говорю: ваш контейнер уровня для левого ящика (выравнивание = начало) должен быть макетом. Вы помещаете в него свои списки. Прямо сейчас вы настроены так, что ваш левый ящик - это только один список. - person Larry Schiefer; 02.08.2014
comment
Я понимаю вашу точку зрения, мне просто трудно ее реализовать. Не могли бы вы предоставить образец того, как это будет работать? - person Basit; 02.08.2014
comment
Только что пересмотрел мой ответ с примером. RelativeLayout — это ваш левый контейнер. Ваши списки находятся внутри него и помещаются вверху и внизу. - person Larry Schiefer; 02.08.2014
comment
Спасибо, Ларри. Я смог добиться того же с двумя ListView, вложенными в LinearLayout. Я просто хочу знать, как добавить их в свой ящик, как я смог с одним ListView. - person Basit; 02.08.2014
comment
Добро пожаловать, я рад, что у вас получилось. - person Larry Schiefer; 02.08.2014
comment
Тем не менее, мне все равно нужно, чтобы они добавили в ящик. Я потерялся там. Довольно новое для Android. - person Basit; 03.08.2014
comment
Посмотрите макет, который я указал в своем ответе. В левом ящике будет 2 списка, один привязан вверху, а другой внизу. - person Larry Schiefer; 03.08.2014
comment
Сначала мне пришлось бы заполнить bottom_list адаптером, как я сделал для единственного элемента ListView. Я не могу сделать это для обоих. - person Basit; 03.08.2014
comment
Вы можете сделать два отдельных адаптера, системе все равно, сколько вы сделаете. Я использовал этот шаблон раньше без проблем. - person Larry Schiefer; 03.08.2014
comment
Я пробовал это без какого-либо успеха. Не могли бы вы предоставить код, специфичный для добавления нескольких адаптеров в макет ящика? Ценю твою помощь. - person Basit; 03.08.2014