86 votes

Ajout d'une marge inférieure au dernier élément du ListView

J'ai besoin d'ajouter à un ListView des éléments compliqués background : différent pour even/odd et coins arrondis en haut et en bas. Cela ressemble à ceci :

ListView top

J'ai implémenté tout cela via level-list, mais il y a encore une chose que je veux faire. Maintenant, l'élément du bas est près du bas de l'écran. Il est préférable d'ajouter un peu d'espace.

ListView bottom looks not good

Je ne veux pas ajouter de marge inférieure au ListView, j'ai besoin d'une marge uniquement pour le dernier élément.

Les moyens que je vois pour y parvenir :

Pied de page

Une sorte de hack - ajouter un pied de page avec un TextView vide à ListView. Mais les pieds de page sont des choses assez instables, ils disparaissent généralement après notifyDataSetChanged et il n'y a aucun moyen de les récupérer.

Image avec des pixels transparents

J'ai demandé au designer d'ajouter des pixels transparents à la ressource de fond inférieure. Malheureusement, dans ce cas, le centrage vertical est complètement cassé. Par exemple, il y a 9patchs comme celui-ci :

9patch

Et une disposition comme celle-ci :

<?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>

Le résultat :

Result

Comme vous le voyez, le centrage ne fonctionne pas. Malheureusement. (BTW, si vous spécifiez ce 9patch comme fond pour le TextView, le centrage fonctionne bien. Si vous connaissez un article, expliquant cela, faites le moi savoir).

Ajouter une marge inférieure au dernier élément dans la mise en œuvre de l'adaptateur

Ça devrait marcher, mais pour une raison inconnue, je n'arrive toujours pas à le faire fonctionner. Je n'aime pas cette méthode, car je n'aime pas modifier les dimensions dans le code.

Alors

Il existe déjà un moyen imaginaire de construire un dessinable XML avec un bitmap et une marge particuliers. Selon le concept de drawables, cela devrait être possible, mais je ne trouve pas d'implémentation. Peut-être que quelqu'un le sait ?

D'autres idées ?

289voto

clocksmith Points 616

Dans votre ListView set a paddingBottom y clipToPadding="false" .

  <ListView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:paddingBottom="8dp"
      android:clipToPadding="false"
      android:scrollbarStyle="outsideOverlay"/>
  • Cela fonctionne également pour RecyclerView .

  • N'utilisez que android:scrollbarStyle="outsideOverlay" si vous voulez que la barre de défilement ne déborde pas dans la zone de rembourrage.

8voto

fullMoon Points 66

Ajoutez un pied de page vide dans votre liste comme ceci :

TextView empty = new TextView(this);
empty.setHeight(150);
listview.addFooterView(empty);

4voto

Gal Rom Points 218

Vous pouvez également le faire à partir du code si vous voulez, par exemple ici je réagis à à l'EditText différentes situations :

   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);
   }

2voto

Mike Points 670

La réponse de Clocksmith est la meilleure et plutôt intelligente. Vous pouvez également créer une vue de pied de page vide.

1voto

Rohit Kumar Points 11

Ajoutez ces deux lignes dans le code XML de votre listView :

android:transcriptMode="alwaysScroll"  
android:stackFromBottom="true"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X