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).
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)
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.
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.
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);
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:
- ajoutez une mise en page externe (linéaire ou Relative) à votre cell_design.xml
- 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)
- 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.