2011-10-24 12 views
36

Tengo un ListView con un montón de elementos dentro de él. ¿Cómo puedo hacer que los elementos superiores e inferiores tengan un margen superior de 10 pb para el ítem superior y un margen inferior de 10 pb para el ítem inferior? Ahora puedo hacer esto con relleno o margen en el ListView, pero el resultado es que cuando se desplaza por el borde del ListView ahora está a 10dp desde la parte inferior de la pantalla. De todos modos alrededor de esto? También he intentado establecer márgenes dentro del método getView de mi adaptador, pero no veo ninguna opción de margen para AbsListView.LayoutParams. Cualquier ayuda sería genial.Android ListView relleno para el contenido sin mover la altura de ListView?

Gracias

+1

sugerencia desagradable, pero ¿qué tal un relleno superior/inferior de la primera/última vista del elemento? Debería verificar y configurarlo en todas las vistas en 'getView' ... – Knickedi

Respuesta

121

El truco es incluir android:clipToPadding="false" en su definición de la vista, por ejemplo .:

<ListView android:id="@+id/list" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="16dip" 
    android:paddingBottom="16dip" 
    android:clipToPadding="false" /> 
+1

Esto era exactamente lo que estaba buscando y era una solución simple. Esto funcionó bien y estoy compilando contra Android 2.1-update1. – Bobbake4

+1

¿Por qué solo en Android 3.0+? De acuerdo con la Referencia de Android, esta característica ha estado presente desde el comienzo (API Nivel 1): http://developer.android.com/reference/android/view/ViewGroup.html#setClipToPadding(boolean) – jenzz

+0

lol pasó 45 minutos intentando para hacer que esto funcione con todo tipo de relleno y configuración de margen. Incluso apareció clipToPadding pero lo malentendió y lo configuró como verdadero :) Gracias –

5

¿Por qué no simplemente marque la posición del elemento en relación con el tamaño de su lista:

Relleno:

public View getView(int position, View convertView, ViewGroup parent) 
    { 
     //recycle views and whatever else you normally would do goes here.. 
     //... 
     //... 

     if (position == 0){ 
      convertView.setPadding(0, 10, 0, 0); //padding on top for top item 
     } 
     else if (position == getCount() - 1){ 
      convertView.setPadding(0, 0, 0, 10); //padding on bottom for bottom item 
     } 
     else{ 
      convertView.setPadding(0, 0, 0, 0); //no padding 
     } 
} 

Para uso márgenes

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
lp.setMargins(left, top, right, bottom); 
convertView.setLayoutParams(lp); 

Ex :

public View getView(int position, View convertView, ViewGroup parent) 
    { 
      //recycle views and whatever else you normally would do goes here.. 
      //... 
      //... 
      LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,  LinearLayout.LayoutParams.WRAP_CONTENT); 
      if (position == 0){ 
       lp.setMargins(0, 10, 0, 0); //margin on top for top item 
      } 
      else if (position == getCount() - 1){ 
       lp.setMargins(0, 10, 0, 10); //margin on bottom for bottom item 
      } 
      else{ 
       lp.setMargins(0, 0, 0, 0); //no margin 
      } 
      convertView.setLayoutParams(lp); 
    } 

esto se proporciona si ha implementado correctamente el método getCount() para su adaptador.

+0

Esta es una excelente solución. Usar el tipo de encabezado G + (que sube al desplazarse hacia abajo y hacia abajo al desplazarse hacia arriba) hace que sea imposible tener una vista de encabezado y tener rellenos en la vista de lista. –

11

Puede obtener espacio en la parte superior e inferior de su ListView, dentro de la región de desplazamiento, usando encabezados y pies de página. Aquí hay un ejemplo rápido:

definir una vista de relleno, que nombré header_footer.xml:

<?xml version="1.0" encoding="utf-8"?> 
<View xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="10dp"/> 

Ahora su método onCreate se parece a esto, suponiendo que usted designó a su ListView listView:

final LayoutInflater inflater = 
     (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final View headerFooter = inflater.inflate(R.layout.header_footer, null); 
    listView.addFooterView(headerFooter); 
    listView.addHeaderView(headerFooter); 

Y luego configura tu adaptador.

+1

Funciona muy bien, creo en todas las versiones de Android, mientras que el uso de clipToPadding (solución anterior) solo funciona en ciertas versiones androd – Don

+0

¡Respuesta útil, gracias! Lo he editado solo para eliminar la complejidad innecesaria. Una simple 'Vista' funcionará bien; no es necesario un 'LinearLayout' dentro de otro' LinearLayout'. –