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

Je dois append pour append ListView avec l’arrière-plan d’éléments compliqués: différent pour les coins pairs / impairs et arrondis en haut et en bas. Cela ressemble à ceci:

ListView top

J’ai mis en place tous ces éléments 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 vaut mieux append de l’espace.

Le fond ListView n'est pas bon

Je ne veux pas append de marge inférieure à ListView, je n’ai besoin que d’une marge pour le dernier élément.

Les manières que je vois pour faire ceci:

Bas de page

Une sorte de hack – append un pied de page avec 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 pixels transparents

J’ai demandé au concepteur d’append des pixels transparents à la ressource d’arrière-plan inférieure. Malheureusement, le centrage vertical est complètement rompu. Par exemple, il y a 9patch comme ceci:

9patch

Et la mise en page comme ceci:

          

Le résultat:

Résultat

Comme vous le voyez, le centrage ne fonctionne pas. Malheureusement. (BTW, si spécifiez ce 9patch comme arrière-plan pour TextView, le centrage fonctionne bien. Si vous connaissez un article, expliquez-le, faites-le moi savoir.)

Ajouter une marge inférieure au dernier élément de l’implémentation 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, car je n’aime pas modifier les dimensions dans le code.

Alors

Il existe déjà une manière imaginaire de construire un dessin XML avec un bitmap et une marge particuliers. Selon le concept des tableaux à dessiner, cela devrait être possible, mais je ne trouve pas d’implémentation. Peut-être que quelqu’un sait?

D’autres idées?

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

   
  • Cela fonctionne également 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.

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

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

vous pouvez aussi le faire depuis le code si vous voulez, par exemple ici je réagis à différentes situations EditText:

  if(s.toSsortingng().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); } 

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

Ajoutez ces deux lignes dans votre code XML listView:

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

Une autre solution pourrait être que vous fassiez une fausse vue avec une certaine hauteur.

Dans votre adaptateur dans getViewCount, retour 2.

Dans getCount, retournez yourData.size + 1.

Dans getViewType, vérifiez si l’élément est le dernier élément return 2;

Utilisez ce type dans getView pour renseigner la vue d’ensemble.

Je suppose que vous voulez append une marge uniquement au dernier élément:

Ainsi, vous pouvez faire de cette manière, dans votre méthode getview, l’index de l’élément de liste et vérifier s’il s’agit du dernier élément, puis append de manière progressive des marges à la vue.