web-dev-qa-db-fra.com

Ajouter une marge au-dessus de l'élément en tête de liste (et sous le dernier) dans Android

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

J'ai une activité avec une barre de titre en haut et un ListView occupant le reste de l'écran. Je veux que mon ListView apparaisse avec un remplissage de 10dp à gauche, à droite et en haut, mais lorsque vous faites défiler le ListView vers le haut, je veux qu'il recouvre le remplissage de 10dp supérieur avant de disparaître sous le bord estompé. De même, lorsque vous faites défiler l'écran vers le bas, le dernier élément de la liste doit apparaître avec 10dp entre le bas de celui-ci et le bas de l'écran (si vous vous demandez pourquoi, c'est qu'il y a une jolie image d'arrière-plan que je veux piquer autour de la liste).

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

Je viens d'un contexte de développeur Web, et l'analogie serait d'ajouter une marge au-dessus du premier élément de la liste (et sous le dernier élément de la liste).

143
Mick Byrne

Tu as écrit:

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

Ensemble ListView's clipToPadding attribuer à false. Cela activera le remplissage autour du ListView et défilant jusqu'à la fin de la mise en page (et pas seulement jusqu'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 des conteneurs de dispositions et de vues.

L'appel à la méthode associée est:

public void setClipToPadding (boolean clipToPadding)
391
Gunnar Karlsson
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);

La liste ci-dessus aura un en-tête et un pied de page de 20 pixels.

19
Jake Wilson

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
greg7gkb

Ma solution utilisant un ListFragment , basée 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
hleinone

La réponse de @Gunnar Karlsson est bonne, mais il y a un problème de recycler prématurément les vues de cellules une fois 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 être corrigé ou non dans une future version d'Android. ( Lorsque vous utilisez clipToPadding dans ListView, les éléments sont recyclés prématurément )

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

  1. Ajouter une disposition externe (linéaire ou relative) à votre cell_design.xml
  2. Sur cette mise en page externe, ajoutez un rembourrage (à savoir 10dip) pour créer une "marge" autour de la cellule entière. (NB seulement le remplissage fonctionnera, pas la marge sur la disposition externe)
  3. Sur le jeu ListView Android:dividerHeight="-10dip", le contraire de ce qui se passe 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 rembourrage dans les cellules les plus hautes et les plus basses sera présent, et le diviseur négatif empêchera les diviseurs de double hauteur entre les deux.

1
James