148 votes

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

Il s'agit d'une question assez fine sur la disposition des éléments dans une ListView sous Android.

J'ai une activité avec une barre de titre en haut et un ListView qui occupe le reste de l'écran. Je veux que ma ListView apparaisse avec un padding de 10dp à gauche, à droite et en haut, mais lorsque vous faites défiler la ListView vers le haut, je veux qu'elle couvre le padding de 10dp du haut avant de disparaître sous le bord estompé. De la même manière, lorsque vous faites défiler la liste vers le bas, le dernier élément de la liste doit apparaître avec 10dp entre le bas du dernier élément de la liste et le bas réel de l'écran (si vous vous demandez pourquoi, c'est parce qu'il y a une jolie image de fond que je veux voir apparaître autour de la liste).

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

Je suis issu du milieu du développement web, 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).

402voto

Gunnar Karlsson Points 15071

Vous avez écrit :

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

Définir ListView's clipToPadding de l'attribut false . Cela permettra d'entourer le ListView et le défilement jusqu'à la fin de la mise en page (et pas seulement jusqu'au bord du rembourrage).

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 conteneurs de mises en page et de vues.

L'association appel de méthode est :

public void setClipToPadding (boolean clipToPadding)

20voto

Jakobud Points 14581
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 padding d'en-tête et de pied de page de 20 pixels.

10voto

greg7gkb Points 1625

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

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

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

2voto

hleinone Points 2367

Ma solution utilisant un ListFragment sur la base des 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);

1voto

James Points 63

La réponse de @Gunnar Karlsson est bonne, mais présente un problème de recyclage prématuré des vues de cellules lorsqu'elles sont complètement derrière le rembourrage, mais pas encore complètement hors de l'écran. Le fait de définir clipToPadding=false est responsable de ce problème, qui sera peut-être corrigé dans une future version d'Android.( Lors de l'utilisation de clipToPadding dans les ListView, les éléments sont recyclés prématurément. )

J'ai une solution simple et agréable, sans effets secondaires :

  1. Ajoutez une mise en page externe (linéaire ou relative) à votre cell_design.xml.
  2. Sur cette mise en page extérieure, ajoutez du remplissage (par exemple 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 extérieure).
  3. Sur le ListView, définissez android:dividerHeight="-10dip" l'opposé de ce qui se trouve autour de la cellule

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X