web-dev-qa-db-fra.com

Ajout de la marge inférieure au dernier élément de ListView

J'ai besoin d'ajouter pour ajouter ListView avec un fond d'éléments compliqué: différent pour les coins pairs/impairs et 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 se trouve près du bas de l'écran. Il est préférable d'ajouter de l'espace. 

ListView bottom looks not good

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

Les manières que je vois faire ceci:

Bas de page

A kind of hack - ajoutez un pied de page contenant TextView vide à ListView. Mais les pieds de page sont des choses assez instables, ils disparaissent généralement après notifyDataSetChanged et il n’ya aucun moyen de les récupérer.

Image avec pixels transparents

J'ai demandé au concepteur d'ajouter des pixels transparents à la ressource d'arrière-plan inférieure. Malheureusement, dans ce cas, le centrage vertical est complètement interrompu ..__ Par exemple, il y a 9patch comme ceci:

9patch

Et la disposition comme ceci:

<?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 TextView, le centrage fonctionne bien. Si vous connaissez un article, expliquez-le-moi, s'il vous plaît.)

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

Cela devrait fonctionner, mais pour une raison inconnue, je ne peux toujours pas le faire fonctionner. Je n'aime pas cette façon, parce que je n'aime pas modifier les dimensions dans le code.

Alors

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

D'autres idées?

66
darja

Dans votre ListView, définissez une paddingBottom et un clipToPadding="false".

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

  • Utilisez uniquement Android:scrollbarStyle="outsideOverlay" si vous souhaitez que la barre de défilement ne déborde pas dans la zone de remplissage.

240
clocksmith

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

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

vous pouvez également le faire à partir de code si vous le souhaitez, par exemple ici, je réagis à Pour éditer le texte, 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);
   }
3
Gal Rom

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

2
SIr Codealot

Une autre solution pourrait être de créer une vue fictive avec une certaine hauteur. 

Dans votre adaptateur dans getViewCount, retournez 2. 

Dans getCount, retournez yourData.size + 1. 

Dans getViewType, vérifiez si l'élément est le dernier élément, retournez 2;

Utilisez ce type dans getView pour renseigner la vue mockview.

0
minimalist

Ajoutez ces deux lignes dans votre code listView:

Android:transcriptMode="alwaysScroll"  
Android:stackFromBottom="true"
0
Rohit Kumar