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:
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.
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:
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.
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:
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:
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.)
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.
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?
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.
ajoutez un pied de page vide dans votre liste comme ceci:
TextView empty = new TextView(this);
empty.setHeight(150);
listview.addFooterView(empty);
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);
}
La réponse de Clocksmith est la meilleure et la plus intelligente. Vous pouvez également créer une vue de pied de page vide.
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.
Ajoutez ces deux lignes dans votre code listView:
Android:transcriptMode="alwaysScroll"
Android:stackFromBottom="true"