studio programacion herramientas fundamentos con avanzado aplicaciones android android-layout android-listview

programacion - Agregar margen arriba del ítem ListView(y debajo del último) en Android



manual de android en pdf (5)

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 ocupando el resto de la pantalla. Quiero que mi ListView aparezca con relleno de 10dp a la izquierda, a la derecha y a la parte superior, pero cuando desplazas el ListView hacia arriba, quiero que cubra el relleno superior de 10dp antes de desaparecer debajo del borde difuminado. Del mismo modo, cuando se desplaza hacia abajo, el último elemento de la lista debe aparecer con 10dp 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é añadir relleno al ListView, pero luego, cuando recorre la lista, desaparece por debajo del margen.

Soy de un fondo de 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).


Apéndice a la respuesta de @Jakobud ...

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

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


La respuesta de @Gunnar Karlsson es buena, pero tiene un problema de que las vistas de celda se reciclen prematuramente cuando están completamente detrás del relleno, pero aún no están completamente fuera de la pantalla. Configurar clipToPadding = false es responsable de esto y puede o no corregirse en una versión futura de Android. ( Cuando se utiliza 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 externo, agregue relleno (es decir, 10 copias) para crear un "margen" alrededor de toda la celda. (Nota: solo el relleno funcionará, no el margen en el diseño externo)
  3. En el conjunto ListView android:dividerHeight="-10dip" , lo contrario de lo que está alrededor de la celda

Comparado con la otra respuesta, no hay necesidad de establecer el color del divisor. El relleno en las celdas más altas y más bajas estará presente, y el divisor negativo evitará divisores de doble altura en el medio.


Mi solución usando un ListFragment , basado 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);


Tu escribiste:

Intenté añadir relleno al ListView, pero luego, cuando recorre la lista, desaparece por debajo del margen.

Establezca ListView''s atributo clipToPadding ListView''s en false . Esto permitirá el relleno alrededor de ListView y el desplazamiento 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 ViewGroup , la clase base para diseños y contenedores de vistas.

La llamada al método relacionado es:

public void setClipToPadding (boolean clipToPadding)


View padding = new View(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.