389 votes

Comment définir l'espace entre les éléments d'une liste sous Android ?

J'ai essayé d'utiliser marginBottom sur le listView pour faire de l'espace entre les éléments du listView, mais les éléments sont toujours attachés ensemble.

Est-ce possible ? Si oui, existe-t-il une manière spécifique de le faire ?

Mon code est le suivant

<LinearLayout
android:id="@+id/alarm_occurences"
android:layout_width="fill_parent" 
android:orientation="vertical"
android:layout_height="fill_parent"
android:background="#EEEEFF"
xmlns:android="http://schemas.android.com/apk/res/android">

<ListView
android:id="@+id/occurences"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>

Mon élément de liste personnalisé :

<com.android.alarm.listItems.AlarmListItem
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" 
android:background="@drawable/alarm_item_background"
android:layout_marginBottom="10dp"    
>
<CheckedTextView     
    android:id="@android:id/text1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:checkMark="?android:attr/listChoiceIndicatorMultiple"
    android:textSize="20sp"
    android:textStyle="bold"
    android:typeface="serif"
    android:padding="10dp"

/>

</com.android.alarm.listItems.AlarmListItem>

Comment puis-je créer un espacement entre les éléments de la liste dans ce cas ?

864voto

Nik Reiman Points 16156

@Asahi a fait le tour de la question, mais je voulais juste ajouter un peu de XML pour ceux qui pourraient arriver plus tard via Google :

<ListView android:id="@+id/MyListView"
  android:layout_height="match_parent"
  android:layout_width="match_parent"
  android:divider="@android:color/transparent"
  android:dividerHeight="10.0sp"/>

Pour une raison quelconque, des valeurs telles que "10", "10.0" et "10sp" sont toutes rejetées par Android pour l'indicateur d'état de santé. dividerHeight valeur. Il veut un nombre à virgule flottante et une unité, comme "10.0sp". Comme le note @Goofyahead, vous pouvez également utiliser des pixels indépendants de l'affichage pour cette valeur (par exemple, "10dp").

25 votes

Cela n'aide pas si vous voulez également afficher un séparateur sans l'étirer.

5 votes

Pour info - peut être fait par le code - getListView().setDividerHeight(10)

2 votes

Ou Android:divider="@null"

63voto

Asahi Points 5938

Peut-être divider ou dividerHeight de l ListView peut résoudre votre problème.

45voto

idunnololz Points 608

Bien que la solution proposée par Nik Reiman fonctionne, je n'ai pas trouvé qu'elle était optimale pour ce que je voulais faire. L'utilisation du séparateur pour définir les marges présente le problème suivant : le séparateur ne sera plus visible et vous ne pourrez pas l'utiliser pour montrer une limite claire entre vos éléments. De plus, il n'ajoute pas de "zone cliquable" à chaque élément. Ainsi, si vous souhaitez rendre vos éléments cliquables et que vos éléments sont fins, il sera très difficile pour quiconque de cliquer sur un élément, car la hauteur ajoutée par le séparateur ne fait pas partie d'un élément.

Heureusement, j'ai trouvé une meilleure solution qui permet à la fois d'afficher les séparateurs et d'ajuster la hauteur de chaque élément en utilisant non pas les marges mais le remplissage. Voici un exemple :

ListView

<ListView
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>

ListItem

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="10dp"
    android:paddingTop="10dp" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:text="Item"
        android:textAppearance="?android:attr/textAppearanceSmall" />

</RelativeLayout>

0 votes

En effet, une meilleure solution. Merci.

16voto

Kailash Points 2170

Vous devez envelopper votre ListView item (say your_listview_item ) dans une autre disposition, par exemple LinearLayout et ajouter une marge à your_listview_item :

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <your_listview_item
        android:id="@+id/list_item"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
    ...
    ...
    />
</LinearLayout>

De cette façon, vous pouvez également ajouter de l'espace, si nécessaire, à droite et à gauche de l'écran. ListView article.

3 votes

Je voulais une marge gauche/droite, votre réponse m'a donc été utile, mais je n'aime pas l'idée d'envelopper une autre mise en page uniquement pour la marge.

0 votes

Il y a plusieurs façons et c'est la plus mauvaise en termes de performances de mise en page essayez de penser à des listes de dizaines (ou de centaines) d'éléments :)

0 votes

@andrea.spot cela n'aurait pas d'importance pour des listes avec des dizaines ou des centaines d'éléments, à moins que ce soit le nombre d'éléments visibles à l'écran en même temps. ListView utilise le recyclage des vues (si vous avez implémenté votre adaptateur correctement).

7voto

LionKing Points 336

Si vous voulez afficher un séparateur avec des marges et sans l'étirer - utilisez InsetDrawable (la taille doit être dans un format, à propos duquel a dit @Nik Reiman) :

ListView :

<ListView
    android:id="@+id/listView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:cacheColorHint="#00000000"
    android:divider="@drawable/separator_line"
    android:dividerHeight="10.0px"/>

@drawable/separator_line :

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetLeft="5.0px"
    android:insetRight="5.0px"
    android:insetTop="8.0px"
    android:insetBottom="8.0px">

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <gradient
            android:startColor="@color/colorStart"
            android:centerColor="@color/colorCenter"
            android:endColor="@color/colorEnd"
            android:type="linear"
            android:angle="0">
        </gradient>
    </shape>
</inset>

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