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:
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.
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:
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:
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?
notifyDataSetChanged()
. Puede estar haciendo algo más mal si eso está sucediendo. Un pie de página es administrado por elListView
y tiene poco que ver con el conjunto de datos real de un adaptador.Respuestas:
En su
ListView
, establezca unpaddingBottom
yclipToPadding="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.fuente
android:scrollbarStyle="outsideOverlay"
para que su barra de desplazamiento no se quede dentro del rellenoagregue un pie de página vacío en su lista como este:
TextView empty = new TextView(this); empty.setHeight(150); listview.addFooterView(empty);
fuente
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); }
fuente
La respuesta de Clocksmith es la mejor y bastante inteligente. También puede crear una vista de pie de página vacía.
fuente
Agregue estas dos líneas en su código XML listView:
android:transcriptMode="alwaysScroll" android:stackFromBottom="true"
fuente
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.
fuente
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.
fuente