Ajouter une marge au-dessus de l'élément ListView (et au-dessous du dernier) dans Android

C'est une très bonne question sur la disposition des éléments dans un ListView dans Android.

J'ai une activité avec une barre de titre en haut et un ListView prenant le reste de l'écran. Je veux que mon ListView apparaisse avec un rembourrage 10dp à gauche, à droite et en haut, mais lorsque vous faites défiler le ListView vers le haut, je veux qu'il couvre le rembourrage 10dp supérieur avant de disparaître sous le bord fané. De même, lorsque vous faites défiler vers le bas, le dernier élément de liste doit apparaître avec 10dp entre le bas du dernier élément de la liste et du bas de l'écran (si vous vous demandez pourquoi, c'est parce qu'il y a une jolie image de fond que je veux pousser autour de la ListView).

J'ai essayé d'ajouter du remplissage à la ListView elle-même, mais lorsque vous faites défiler la liste, elle disparaît sous le bord du remplissage.

Je viens d'un arrière-plan Web dev, et l'analogie serait d'ajouter une marge au-dessus du premier élément de liste (et en dessous du dernier élément de liste).

140
demandé sur Mick Byrne 2011-06-09 08:39:17

5 réponses

Vous avez écrit:

J'ai essayé d'ajouter du rembourrage à la ListView elle-même, mais lorsque vous faites défiler la liste, elle disparaît sous le bord du rembourrage.

Ensemble ListView's clipToPadding attribut à false. Cela permettra le remplissage autour de la ListView et défilement à la fin de la mise en page (et pas seulement au bord du remplissage).

Un exemple:

<ListView
    android:id="@+id/list_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:divider="@android:color/transparent"
    android:dividerHeight="10.0sp"
    android:padding="16dip"
    android:clipToPadding="false"/>

android:clipToPadding est un attribut XML de ViewGroup, la classe de base pour les mises en page et vues conteneur.

L'appel de méthode associé est:

public void setClipToPadding (boolean clipToPadding)
386
répondu Gunnar Karlsson 2013-08-23 01:08:25
View padding = new View(this);
padding.setHeight(20); // Can only specify in pixels unfortunately. No DIP :-(

ListView myListView = (ListView) findViewById(R.id.my_list_view);

myListView.addHeaderView(padding);
myListView.addFooterView(padding);

myListView.setAdapter(myAdapter);

Le ListView ci-dessus aura un remplissage d'en-tête et de pied de page de 20 pixels.

19
répondu Jake Wilson 2014-10-14 16:14:06

Appendice à la réponse de @ Jakobud...

Mon listView utilisait déjà les propriétés android:divider/android:dividerHeight pour créer des espaces transparents entre les éléments listView. Cela m'a permis d'ajouter simplement les propriétés android:headerDividersEnabled et android:footerDividersEnabled et de définir les vues D'en-tête et de pied de page sur new View(Activity.this).

Légère simplification pour les cas où vous avez déjà configuré des diviseurs dans listView.

10
répondu greg7gkb 2012-05-23 04:52:58

Ma solution en utilisant un ListFragment, basé sur les solutions de @ Jakobud et @ greg7gkb.

ListView listView = getListView();
listView.setDivider(null);
listView.setDividerHeight(getResources().getDimensionPixelSize(R.dimen.divider_height));
listView.setHeaderDividersEnabled(true);
listView.setFooterDividersEnabled(true);
View padding = new View(getActivity());
listView.addHeaderView(padding);
listView.addFooterView(padding);
2
répondu hleinone 2013-11-01 16:12:42

La réponse de@Gunnar Karlsson est bonne, mais a un problème de vues de cellules recyclées prématurément quand complètement derrière le remplissage, mais pas encore complètement hors de l'écran. Définir clipToPadding = false est responsable de cela et peut ou non être corrigé dans une future version d'android.( Lorsque vous utilisez clipToPadding dans ListView, les éléments sont recyclés prématurément )

J'ai une bonne solution simple sans effets secondaires:

  1. ajoutez une mise en page externe (linéaire ou Relative) à votre cell_design.xml
  2. sur cette mise en page externe, ajoutez un remplissage (c'est-à-dire 10dip) pour créer une "marge" autour de la cellule entière. (N.B. seul le remplissage fonctionnera, pas la marge sur la mise en page externe)
  3. sur L'ensemble ListView android:dividerHeight="-10dip", le contraire de ce qui est autour de la cellule

Par rapport à l'autre réponse, il n'est pas nécessaire de définir la couleur du diviseur. Le rembourrage dans les cellules les plus hautes et les plus basses sera présent, et le diviseur négatif empêchera les diviseurs à double hauteur entre les deux.

1
répondu James 2017-05-23 12:26:12