La mejor manera de implementar un cajón de desplazamiento de navegación

He estado agregando un cajón de navegación a una de mis aplicaciones, y comencé a preguntarme si sería mejor cambiar de usar un ListView a múltiples TextView para los elementos de la lista de cajones de navegación. Observando las Directrices de Diseño de Google sobre el contenido del Cajón de Navegación (específicamente la sección sobre 'Desplazamiento') , me di cuenta de que puede verse mejor con múltiples TextView .

Por el momento, estoy usando un ListView y ImageView en mi cajón de navegación (se ve un poco como esto.Sin embargo, cuando me desplaza en el cajón de navegación (lo hago girando mi dispositivo de paisaje como no hay suficientes elementos en mi lista Pero sólo las ListView , y el ImageView permanece como está.Quiero que sea capaz de scoll más como este, donde el ImageView también se desplaza con el ListView .

Además, encontré que mi ListView en mi cajón de navegación no tiene los efectos de rizo como se muestra en esta imagen, aunque otros ListView en mis otras Activity y Fragment .

¿Cuáles son los problemas que enfrento y cómo puedo resolverlos?

Actualizar:

En la aplicación de E / S de Google (2014), parece haber un LinearLayout en la parte inferior del diseño del cajón de navegación que creo que es responsable de la lista de elementos mostrados. ¿Podría alguien explicar cómo funcionaría?

Sólo se desplaza el ListView y el ImageView permanece como está

Suena como su cajón contiene un ImageView en la tapa y entonces un ListView sigue. Con esta configuración sólo se desplaza el ListView (porque es la única vista que se puede desplazar).

ImageView agregar el ImageView como un encabezado que siempre está al principio de la lista. Como uno de los comentarios sugeridos, haga listView.addHeaderView .

Parece haber un LinearLayout en la parte inferior del diseño del cajón de navegación que creo que es responsable de la lista de elementos mostrados. ¿Podría alguien explicar cómo funcionaría?

Utilizan el LinearLayout como un contenedor para contener todos los TextView s:

 private void createNavDrawerItems() { mDrawerItemsListContainer = (ViewGroup) findViewById(R.id.navdrawer_items_list); ... int i = 0; for (int itemId : mNavDrawerItems) { mNavDrawerItemViews[i] = makeNavDrawerItem(itemId, mDrawerItemsListContainer); mDrawerItemsListContainer.addView(mNavDrawerItemViews[i]); ++i; } } 

Creo que la razón por la que utilizan un LinearLayout e inflar todos los elementos de forma programática es ser capaz de utilizar separador elementos fácilmente:

 private View makeNavDrawerItem(final int itemId, ViewGroup container) { ... if (itemId == NAVDRAWER_ITEM_SEPARATOR) { layoutToInflate = R.layout.navdrawer_separator; } else if (itemId == NAVDRAWER_ITEM_SEPARATOR_SPECIAL) { layoutToInflate = R.layout.navdrawer_separator; } else { layoutToInflate = R.layout.navdrawer_item; } ... return view; } 

En un ListView tendría que crear un tipo de elemento independiente y utilizar el diseño del divisor allí, lo que posiblemente podría ser más engorroso.

A primera vista , sin embargo, este código sólo parece estar reinventando la rueda ya que todo esto es posible con un ListView .

A partir del 29 de mayo de 2015 (después de Google I / O 2015 ), puede utilizar la Biblioteca de soporte de diseño de Android para agregar un NavigationView a su (s) aplicación (s). El artículo Android Developer Blogspot establece lo siguiente:

Vista de navegación

El cajón de navegación puede ser un punto focal importante para la identidad y la navegación en su aplicación y la coherencia en el diseño aquí puede hacer una diferencia considerable en la facilidad de su aplicación es navegar, en particular para los usuarios de primera vez. NavigationView hace esto más fácil proporcionando el marco que necesita para el cajón de navegación, así como la capacidad de inflar sus elementos de navegación a través de un recurso de menú.

A continuación, puede comenzar a utilizar la biblioteca de diseño con una sola nueva dependencia:
compile 'com.android.support:design:22.2.0'

La biblioteca de diseño, AppCompat y toda la Biblioteca de soporte técnico de Android son herramientas importantes para proporcionar los bloques de construcción necesarios para crear una aplicación moderna y de gran apariencia para Android sin crear todo desde cero.

La implementación del cajón de navegación desplazable con android.support.v4.widget.DrawerLayout y NavigationView podría ser incluso más sencillo de lo que se describe en: http://android-developers.blogspot.ru/2015/05/android-design-support-library. Html

Ese artículo sugiere agregar cada elemento del Cajón de navegación de su aplicación como elemento de menú. Esto es genial y sin duda una manera de ir para la mayoría de los desarrolladores. Pero ¿qué pasa si ya tiene un cajón de navegación implementado dentro, por ejemplo, Linear Layout?

Parece que usted puede fácilmente hacer su vieja buena disposición desplazable: sólo se establece como una "app: headerLayout" de la NavigationView. No más cambios son necesarios! Por lo tanto, en una solución final tendrá:

Un diseño de su actividad, similar a la anterior publicación en el blog, pero sin un atributo "app: menu =" @ menu / drawer ", por ejemplo:

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <!-- your content layout --> <android.support.design.widget.NavigationView android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/drawer_header" /> </android.support.v4.widget.DrawerLayout> 

Y un diseño para todo el contenido de su cajón de edad en el archivo "drawer_header.xml", migrado sin ningún cambio en este cajón desplazable, por ejemplo, esto:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:choiceMode="singleChoice" android:orientation="vertical"> <TextView android:id="@+id/myFirstButton" android:onClick="onMyFirstButtonClick" android:text="@string/my_first_button_title"/> <TextView android:id="@+id/goToTheTopButton" android:onClick="onGoToTheTopButtonClick" android:text="@string/go_to_the_top_title"/> <View style="@style/Divider"/> <!-- Some other "menu items" --> </LinearLayout> 

Para obtener un ejemplo de funcionamiento completo, vea este diseño de la actividad: https://github.com/andstatus/andstatus/blob/master/app/src/main/res/layout/timeline.xml y este commit, donde migré a un Cajón de navegación desplazable : https://github.com/andstatus/andstatus/commit/a80b299de714bdd65cacb138ffb31adc3ea23a98

  • Cómo abrir el cajón de navegación en el botón de clic en el fragmento principal?
  • Nuevo ícono oficial para Android Navigation Drawer
  • ¿Cuál es el propósito de las herramientas: openDrawer = "start" al crear un DrawerLayout (con NavigationView) desde el asistente?
  • Cómo deslizar el ActionBar junto con el NavigationDrawer
  • Desactivar la hamburguesa para animar las flechas
  • El color del elemento de menú NavigationView no cambia en API 15
  • Navegación Cajón de contenedores múltiples y mejores prácticas
  • ActionBarCompat + NavigationDrawerFragment no funciona en android 4.0 y 4.1
  • ¿Por qué fragmento no muestra el diseño en mi cajón de navegación
  • Reemplazar el diseño de la barra de herramientas de acuerdo con el fragmento visualizado
  • Uso de fragmentos del cajón de navegación para superponer la actividad
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.