Agregue un margen sobre el elemento ListView superior (y debajo del último) en Android

7 minutos de lectura

avatar de usuario
mick byrne

Esta es una pregunta bastante buena sobre el diseño de los elementos en un ListView en Android.

Tengo una actividad con una barra de título en la parte superior y un ListView que ocupa el resto de la pantalla. Quiero que mi ListView aparezca con un relleno de 10 dp a la izquierda, a la derecha y en la parte superior, pero cuando desplaza el ListView hacia arriba, quiero que cubra el relleno superior de 10 dp antes de desaparecer bajo el borde difuminado. De manera similar, cuando se desplaza hacia abajo, el último elemento de la lista debería aparecer con 10 dp entre la parte inferior del último elemento de la lista y la parte inferior real de la pantalla (si se pregunta por qué, es porque hay una bonita imagen de fondo que quiero asomando por el ListView).

Intenté agregar relleno al propio ListView, pero luego, cuando desplaza la lista, desaparece debajo del borde del relleno.

Tengo experiencia en desarrollo web, y la analogía sería agregar un margen sobre el primer elemento de la lista (y debajo del último elemento de la lista).

  • especifique solo el margen izquierdo y derecho… intente pegar su xml aquí, para que pueda ver el problema editar: espere, quiere decir… ¿Quiere que el relleno superior e inferior también se desplace?

    – Tek Yin

    9 de junio de 2011 a las 5:00

  • No puedo especificar el margen izquierdo y derecho: no hay ‘margen’ en el diseño de Android, solo relleno. Pero, sí, quiero que se desplace el relleno superior e inferior; esa es una buena manera de describirlo.

    –Mick Byrne

    9 de junio de 2011 a las 5:43


  • Ya probé varios métodos, y aun así fallé… Tengo algunos trucos que hacer, pero será más difícil hacerlo… pones 2 objetos personalizados en el elemento de la lista en la primera y última posición… y usas un adaptador personalizado para detectar el elemento y dibujarlo de manera diferente (altura estrecha y transparente)

    – Tek Yin

    9 de junio de 2011 a las 6:15

  • Sí… eso es a lo que he estado pensando recurrir también. Pero hay todo tipo de complicaciones con eso, ya que tendré que establecer el color de fondo en los elementos de la lista, no en la vista, lo que significa que luego tendré que piratear manualmente algún efecto para mostrar cuándo ha tocado las cosas. . Gracias por tu ayuda de todos modos…

    –Mick Byrne

    9 de junio de 2011 a las 6:28

  • Buenas noticias… Tengo la solución… puedes usar addHeaderView(View v) en ListActivity… solo llama getListView(). addHeaderView(capView) y getListView(). addHeaderView(botView) asegúrese de que llamó antes de inicializar el contenido de la lista, por ejemplo. setListAdapter(adaptador);

    – Tek Yin

    26 de junio de 2011 a las 3:17


avatar de usuario
onosendai

Tu escribiste:

Intenté agregar relleno al propio ListView, pero luego, cuando desplaza la lista, desaparece debajo del borde del relleno.

Establecer ListView's clipToPadding atribuir a false. Esto habilitará el relleno alrededor del ListView y desplazándose hasta el final del diseño (y no solo hasta el borde del relleno).

Un ejemplo:

<ListView
    android:id="@+id/list_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:divider="@android:color/transparent"
    android:dividerHeight="10.0sp"
    android:padding="16dip"
    android:clipToPadding="false"/>

android:clipToPadding es un atributo XML de ViewGroupla clase base para diseños y contenedores de vistas.

El relacionado llamada de método es:

public void setClipToPadding (boolean clipToPadding)

  • Además, esto se puede convertir en un estilo o tema a través de <item name="android:clipToPadding">false</item>

    – pjco

    7 mayo 2013 a las 16:28

  • Oh, esto también se aplica a ScrollView

    – pjco

    7 mayo 2013 a las 16:35

  • Un poco tarde para la discusión, pero tenga en cuenta que en dispositivos más antiguos (lo vi en algunos dispositivos 2.3.x), las vistas de elementos de lista se reciclan demasiado pronto. Si bien la fase de dibujo sabe que puede dibujar allí, la fase de diseño no lo sabe, por lo que cree que el elemento ya está fuera de la pantalla. Consulte stackoverflow.com/questions/15915226/….

    –Jeffrey Klardie

    24 de enero de 2014 a las 10:13

  • @JeffreyKlardie Me encuentro con el problema de que los elementos se reciclan demasiado pronto en un dispositivo más antiguo e incluso hace que la barra de desplazamiento cambie de tamaño sobre la marcha, lo que se ve realmente extraño. @pjco No estoy seguro de por qué, pero la configuración clipToPadding a través de un estilo no me funciona, es como si no se aplicara. Aunque, si lo configuro directamente en ListView, funciona.

    – Fuerza Mágica

    16/04/2014 a las 22:35

  • no olvides android:scrollbarStyle="outsideOverlay" por lo que la barra de desplazamiento también pasa por el relleno

    – jfcartier

    18 de noviembre de 2014 a las 18:56

avatar de usuario
jake wilson

Space padding = new Space(this);
padding.setHeight(20); // Can only specify in pixels unfortunately. No DIP :-(

ListView myListView = (ListView) findViewById(R.id.my_list_view);

myListView.addHeaderView(padding);
myListView.addFooterView(padding);

myListView.setAdapter(myAdapter);

El ListView anterior tendrá un relleno de encabezado y pie de página de 20 píxeles.

  • ¡Gracias por la respuesta! ¡¡Funciona genial!! Si desea poner la altura en dp, puede hacerlo usando DisplayMetrics: float mDensity = getResources().getDisplayMetrics().density; int height = (int) (50 * mDensity + 0.5f); padding.setHeight(height);

    – Toni Álvarez

    16 mayo 2012 a las 16:23


  • O mejor aún, obtenga dimensiones en dp al nivel de Java usando getResources().getDimensionPixelOffset(R.dimen.some_value);

    – greg7gkb

    23 de mayo de 2012 a las 4:43

  • Verdaderamente sorprendido por la cantidad de cosas de Android que aprendo en StackOverflow en comparación con las que aprendo en el sitio de desarrolladores

    – TrueCoke

    7 febrero 2013 a las 21:33

  • O mejor (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());

    – Eugen Pechanec

    29 de septiembre de 2014 a las 13:04

  • No existe el método “setHeight()” para View en API 23. En su lugar, podemos usar “setMinimumHeight()”.

    – KWA

    14 de julio de 2016 a las 9:30

Apéndice a la respuesta de @ Jakobud …

Mi listView ya estaba haciendo uso de la android:divider/android:dividerHeight properties para crear espacios transparentes entre los elementos de listView. Esto me permitió simplemente agregar el android:headerDividersEnabled y android:footerDividersEnabled propiedades y establezca las vistas de encabezado y pie de página en new View(Activity.this).

Ligera simplificación para los casos en los que ya tiene configurados divisores en listView.

  • Aconsejaría a cualquier persona que, cuando sea posible, use divisores en lugar de márgenes y rellenos de elementos. Gran respuesta

    – dzsonni

    21 de octubre de 2013 a las 13:24

Mi solución usando un ListFragmentbasado en las soluciones de @Jakobud y @greg7gkb.

ListView listView = getListView();
listView.setDivider(null);
listView.setDividerHeight(getResources().getDimensionPixelSize(R.dimen.divider_height));
listView.setHeaderDividersEnabled(true);
listView.setFooterDividersEnabled(true);
View padding = new View(getActivity());
listView.addHeaderView(padding);
listView.addFooterView(padding);

avatar de usuario
Jaime

La respuesta de @Gunnar Karlsson es buena, pero tiene el problema de que las vistas de las celdas se reciclan prematuramente cuando están completamente detrás del relleno, pero aún no están completamente fuera de la pantalla. Establecer clipToPadding=false es responsable de esto y puede o no corregirse en una versión futura de Android. (Cuando se usa clipToPadding en ListView, los elementos se reciclan prematuramente)

Tengo una buena solución simple sin efectos secundarios:

  1. Agregue un diseño externo (lineal o relativo) a su cell_design.xml
  2. En este diseño exterior, agregue relleno (es decir, 10 inmersiones) para crear un “margen” alrededor de toda la celda. (Nota: solo funcionará el relleno, no el margen en el diseño exterior)
  3. En el conjunto ListView android:dividerHeight="-10dip"lo contrario de lo que hay alrededor de la celda

En comparación con la otra respuesta, no es necesario establecer el color del divisor. El relleno en las celdas superiores e inferiores estará presente, y el divisor negativo evitará los divisores de doble altura en el medio.

  • “sin efectos secundarios” eso no es del todo cierto. Agregar otra capa en su jerarquía de vista, especialmente en un elemento de vista de lista, significa degradar el rendimiento.

    – Teovaldo

    14/10/2014 a las 16:19

  • “sin efectos secundarios” eso no es del todo cierto. Agregar otra capa en su jerarquía de vista, especialmente en un elemento de vista de lista, significa degradar el rendimiento.

    – Teovaldo

    14/10/2014 a las 16:19

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad