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).
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)
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.
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 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);
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:
Android:dividerHeight="-10dip"
, le contraire de ce qui se passe autour de la cellulePar 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.