Agregar margen inferior al último elemento de ListView

83

Necesito agregar para agregar ListView con fondo de elementos complicados: diferente para esquinas pares / impares y redondeadas en la parte superior e inferior. Se parece a esto:

ListView arriba

He implementado todas estas cosas a través de la lista de niveles, pero hay una cosa más que quiero hacer. Ahora el elemento inferior está cerca de la parte inferior de la pantalla. Es mejor agregar algo de espacio.

La parte inferior de ListView no se ve bien

No quiero agregar margen inferior a ListView, necesito margen solo para el último elemento.

Las formas que veo para hacer esto:

Pie de página

Una especie de truco: agregue un pie de página con TextView vacío a ListView. Pero los pies de página son cosas bastante inestables, generalmente desaparecen después de notifyDataSetChanged y no hay forma de recuperarlos.

Imagen con píxeles transparentes

Le pedí al diseñador que agregara píxeles transparentes al recurso de fondo inferior. Desafortunadamente, en este caso el centrado vertical está completamente roto. Por ejemplo, hay 9 parche como este:

9 parche

Y diseño como este:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
        >
    <!-- View with background with transparent pixels on bottom -->
    <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"
                  android:id="@+id/item"
                  android:background="@drawable/some_bgr"
                  android:padding="10dp"
            >
        <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"
                  android:text="Title"
                  android:layout_gravity="center"
                  android:textSize="18sp"
                />
        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                  android:text="Detail"
                  android:layout_gravity="center"
                  android:textSize="18sp"
                />
    </LinearLayout>

    <!-- Just for marking place took by view -->
    <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"
                 android:layout_below="@id/item"
                 android:background="#88ff55"
            />
</RelativeLayout>

El resultado:

Resultado

Como puede ver, el centrado no funciona. Desafortunadamente. (Por cierto, si especifica este parche 9 como fondo para TextView, el centrado funciona bien. Si conoce algún artículo que explique esto, hágamelo saber).

Agregar margen inferior al último elemento en la implementación del adaptador

Eso debería funcionar, pero por una razón desconocida todavía no puedo hacerlo funcionar. No me gusta esta forma, porque no me gusta modificar dimensiones en el código.

Entonces

Ya existe una forma imaginaria: construya algún XML dibujable con un mapa de bits y un margen particulares. Según el concepto de elementos de diseño, debería ser posible, pero no puedo encontrar la implementación. ¿Puede ser que alguien lo sepa?

¿Alguna otra idea?

darja
fuente
¿Solo desea agregar un margen después del último elemento?
Goofy
Si. La pregunta suena exactamente así
darja
Por favor, verifique mi respuesta a continuación
Goofy
De hecho, consideraría usar el enfoque de pie de página. Nunca los he visto desaparecer solos, especialmente después de una llamada a notifyDataSetChanged(). Puede estar haciendo algo más mal si eso está sucediendo. Un pie de página es administrado por el ListViewy tiene poco que ver con el conjunto de datos real de un adaptador.
MH.
La mejor manera es [ stackoverflow.com/questions/6288167/… [1]: stackoverflow.com/questions/6288167/… realmente me ayudó
Bunyod

Respuestas:

280

En su ListView, establezca un paddingBottomy clipToPadding="false".

  <ListView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:paddingBottom="8dp"
      android:clipToPadding="false"
      android:scrollbarStyle="outsideOverlay"/>
  • Esto también funciona para RecyclerView.

  • Úselo solo android:scrollbarStyle="outsideOverlay"si desea que la barra de desplazamiento no se desborde en el área acolchada.

relojero
fuente
mi 8dp desde abajo está recortado ... en realidad quiero 8dp abajo solo para el último elemento ... así que, ¿qué hacer?
Elizabeth
2
@AndroidBeginner No entiendo lo que quieres. Eso es exactamente lo que hace esto.
relojero
12
No olvide agregar android:scrollbarStyle="outsideOverlay"para que su barra de desplazamiento no se quede dentro del relleno
gfpacheco
1
puede haber problemas con los colores. El relleno inferior tiene el color de fondo de la vista de lista, no el color de fondo del último elemento
grine4ka
¿Podemos administrar el indicador de actualización SwipeRefreshLayout usando esto?
Hemant Kaushik
8

agregue un pie de página vacío en su lista como este:

TextView empty = new TextView(this);
empty.setHeight(150);
listview.addFooterView(empty);
Badr
fuente
para eso recomiendo: listview.addFooterView (vacío, datos: nulo, isSelectable: falso);
Simon
4

también puede hacerlo desde el código si lo desea, por ejemplo, aquí reacciono a diferentes situaciones de EditText:

   if(s.toString().length()>0)
   {
      contacts_lv.setClipToPadding(false);
      contacts_lv.setPadding(0,0,0,270*screenDensity);
   }
   else
   {
      contacts_lv.setClipToPadding(true);
      contacts_lv.setPadding(0,0,0,0);
   }
Gal Rom
fuente
2

La respuesta de Clocksmith es la mejor y bastante inteligente. También puede crear una vista de pie de página vacía.

SIr Codealot
fuente
1
la primera solución no funcionó, pero su sugerencia sí, de hecho es una buena idea, gracias
Badr
1

Agregue estas dos líneas en su código XML listView:

android:transcriptMode="alwaysScroll"  
android:stackFromBottom="true"
Rohit Kumar
fuente
0

Otra solución podría ser que haga una vista simulada con cierta altura.

En su adaptador en getViewCount return 2.

En getCount devuelve yourData.size + 1.

En getViewType, compruebe si el elemento es el último elemento return 2;

Utilice este tipo en getView para completar la vista simulada.

minimalista
fuente
-2

Supongo que desea agregar margen solo al último elemento:

Por lo tanto, puede hacer de esta manera, en su método getview, el índice del elemento de la lista y verificar si es el último elemento, luego agregar un margen a la vista de manera programada.

Mentecato
fuente
Lo describí de esta manera en "Agregar margen inferior al último elemento en la implementación del adaptador". Me pregunto si hay formas más elegantes.
darja
¿Por qué no quieres hacerlo de esta manera?
Goofy
Consulte la explicación en cuestión.
darja
No hay otras ideas - por lo que parece ser la única manera
darja
@Goofy ¿Cómo se agrega el margen a la vista de la última fila de la lista?
vrunoa