Espacement entre les éléments listView Android

j'ai essayé d'utiliser marginBottom sur la listView pour faire de l'espace entre les éléments listView, mais les éléments sont quand même attachés ensemble.

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

mon code est en dessous de

<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 article de liste de coutume:

<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 faire l'espacement entre les éléments de liste dans ce cas?

346
demandé sur M.G 2011-02-13 16:10:31

17 réponses

@Asahi à peu près touché le clou sur la tête, mais je voulais juste ajouter un peu de XML pour n'importe qui peut-être flottant ici 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, les valeurs telles que" 10"," 10.0", et" 10sp "Tous sont rejetés par Android pour la valeur dividerHeight . Il veut un numéro à virgule flottante et une unité, comme "10.0 sp". Comme @Goofyahead le NOTE, Vous pouvez également utiliser des pixels indépendants de l'affichage pour cette valeur (i.e., "10dp").

785
répondu Nik Reiman 2015-12-17 15:33:40

peut-être divider ou dividerHeight propriété de la ListView peut résoudre votre problème.

60
répondu Asahi 2014-09-29 08:29:52

bien que la solution de Nik Reiman fonctionne, j'ai trouvé qu'elle n'était pas une solution optimale pour ce que je voulais faire. En utilisant le diviseur de définir les marges eu le problème que le diviseur ne sera plus visible de sorte que vous ne pouvez pas l'utiliser pour afficher une frontière claire entre articles. Aussi, il n'ajoute pas plus de "zone cliquable" pour chaque article donc si vous voulez rendre vos objets cliquables et vos articles sont minces, il sera très difficile pour quiconque de cliquer sur un élément de la hauteur ajoutée par l' diviseur ne fait pas partie d'un élément.

heureusement, j'ai trouvé une meilleure solution qui vous permet à la fois de montrer des diviseurs et vous permet de régler la hauteur de chaque élément en utilisant non pas des marges mais du rembourrage. 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>
41
répondu idunnololz 2015-01-21 17:40:22

vous devez envelopper votre article ListView (dites your_listview_item ) dans une autre disposition E. g LinearLayout et ajouter 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 la ListView .

16
répondu Vasu 2012-06-07 03:10:21

ma solution pour ajouter plus d'espace mais garder la ligne horizontale était d'ajouter divider.xml dans le dossier res/drawable et de définir la forme de la ligne à l'intérieur:

diviseur.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line" >

    <stroke
        android:width="1px"
        android:color="@color/nice_blue" />

</shape>

puis dans ma liste je me réfère à mon diviseur comme suit:

<ListView
    android:id="@+id/listViewScheduledReminders"
    android:layout_width="match_parent"
    android:layout_height="0dip"
    android:layout_marginBottom="@dimen/mediumMargin"
    android:layout_weight="1"
    android:divider="@drawable/divider"
    android:dividerHeight="16.0dp"
    android:padding="@dimen/smallMargin" >

</ListView>

remarquez le android:dividerHeight="16.0dp" en augmentant et en diminuant cette hauteur, j'ajoute plus de rembourrage sur le dessus et le bas de la ligne de séparation.

j'ai utilisé cette page pour référence: http://developer.android.com/guide/topics/resources/drawable-resource.html#stroke-element

11
répondu kamelnyc 2016-09-27 13:10:34

si vous voulez montrer un diviseur avec des marges et sans l'étirer - utilisez InsetDrawable (la taille doit être dans un format, dont 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>
8
répondu LionKing 2013-07-12 20:07:59

vous pouvez utiliser:

android:divider="@null"
android:dividerHeight="3dp"

exemple:

<ListView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listView" android:layout_gravity="center_horizontal"
        android:dividerHeight="3dp"
        android:divider="@null" android:clickable="false"/>
7
répondu mspapant 2014-02-03 12:59:21

je me rends compte qu'une réponse a déjà été choisie, mais je voulais juste partager ce qui a fini par fonctionner pour moi quand je suis tombé sur ce problème.

j'ai eu un listView où chaque entrée dans le listView était définie par sa propre disposition, similaire à ce que Sammy a posté dans sa question. J'ai essayé l'approche suggérée de changer la hauteur du diviseur, mais cela n'a pas fini par sembler trop joli, même avec un diviseur invisible. Après quelques expérimentations, j'ai simplement ajouté un android:paddingBottom="5dip" au dernier élément de mise en page TextView dans le fichier XML qui définit les entrées listView individuelles.

cela a fini par me donner exactement ce que j'essayais d'atteindre via l'utilisation de android:layout_marginBottom . J'ai trouvé cette solution pour produire un plus esthétique résultat que d'essayer d'augmenter le diviseur de hauteur.

5
répondu Tim Severeijns 2012-09-07 20:36:03

la solution la plus simple avec le code existant de L'OP (énumérer les éléments déjà rembourrés) est d'ajouter le code suivant:

listView.setDivider(new ColorDrawable(Color.TRANSPARENT));  //hide the divider
listView.setClipToPadding(false);   // list items won't clip, so padding stays

Ce DONC réponse m'a aidé.

Note: vous pouvez faire face à un bug de la liste recyclage des articles trop tôt sur les anciennes plateformes, comme il a été demandé ici .

3
répondu Sufian 2017-05-23 12:34:35

Pour mon application, j'ai fait de cette façon

 <ListView
    android:id="@+id/staff_jobassigned_listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@null"
    android:dividerHeight="10dp">

</ListView>

et voici le résultat

enter image description here

juste android: divider= "@null " et fournir la hauteur au divider fait pour moi.

3
répondu Sagar Pawar 2015-12-02 08:13:51

au lieu de donner de la marge, vous devez donner du rembourrage:

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:divider="@android:color/green"
    android:dividerHeight="4dp"
    android:layout_alignParentTop="true"
    android:padding="5dp" >

</ListView>

ou

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:paddingTop="2dp"
    android:divider="@android:color/green"
    android:dividerHeight="4dp"
    android:paddingLeft="1dp"
    android:paddingRight="1dp"
    android:paddingBottom="2dp"
    android:paddingStart="0dp"
    android:paddingEnd="0dp" >

</ListView>
3
répondu Rahul Raina 2018-02-21 09:43:35
<ListView
    android:clipToPadding="false"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"
    android:dividerHeight="10dp"
    android:divider="@null"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</ListView>

et mettez paddingTop , paddingBottom et dividerHeight à la même valeur pour obtenir l'espacement égal entre tous les éléments et l'espace au haut et en bas de la liste.

j'ai mis clipToPadding à false pour laisser le point de vue doit être établi dans cette zone rembourrée.

j'ai mis divider à @null pour supprimer les lignes entre les éléments de la liste.

2
répondu Andrew Gallasch 2015-06-02 08:01:25

une autre façon d'augmenter l'espacement entre les éléments de la liste est que vous ajoutez une vue vide à votre code d'adaptateur en fournissant l'attribut layout_height avec l'espacement dont vous avez besoin. Par exemple, pour augmenter l'espacement entre les éléments de votre liste, Ajoutez cette vue factice(vue vide) à la fin de vos éléments de liste.

<View
    android:layout_width="match_parent"
    android:layout_height="15dp"/>

ainsi ceci fournira un espacement de bas de 15 dp entre les articles de vue de liste. Vous pouvez l'ajouter directement si le layout parent est linéaire et l'orientation est verticale ou prendre les mesures appropriées pour une autre disposition. Espérons que cela aide :-)

2
répondu FingerSmith 2015-08-28 08:33:30

vous avez juste besoin de rendre le fond transparent du diviseur de liste et faire la hauteur en fonction de votre espace nécessaire.

<ListView 
         android:id="@+id/custom_list"
         android:layout_height="match_parent"
         android:layout_width="match_parent"
         android:divider="#00ffffff"
         android:dividerHeight="20dp"/>
2
répondu pawan kumar 2017-04-03 12:23:37

j'ai trouvé une solution pas si bonne pour cela dans le cas où vous utilisez une vue horizontale, puisque les diviseurs ne semblent pas fonctionner avec elle, mais je pense que cela fonctionnera de toute façon pour la vue List plus courante.

Juste en ajoutant:

<View
android:layout_marginBottom="xx dp/sp"/>

dans la vue la plus basse de la disposition que vous gonflez dans la classe adaptateur créera l'espacement entre les articles

1
répondu Juliagu 2015-12-16 14:24:43

afin de donner l'espacement entre les vues à l'intérieur d'un listView s'il vous plaît utiliser le rembourrage sur vos vues de gonflage.

Vous pouvez utiliser android:paddingBottom="(number)dp" && android:paddingTop="(number)dp" sur votre point de vue ou opinions vous êtes gonfler à l'intérieur de votre liste.

la solution de diviseur n'est qu'une solution, parce qu'un jour, quand vous voudrez utiliser une couleur de diviseur (en ce moment c'est transparent) vous verrez que la ligne de diviseur est étirée.

1
répondu Avi Levin 2016-09-27 13:09:54

beaucoup de ces solutions fonctionnent. Cependant, si tout ce que vous voulez est d'être en mesure de définir la marge entre les éléments la méthode la plus simple que j'ai inventé est d'envelopper votre élément - dans votre cas, le CheckedTextView - dans une linéarisation et mettre votre formatage de marge pour l'élément dans ce, pas la disposition racine. Assurez-vous de donner à cette mise en page d'enrubannage un id et de le créer avec votre CheckedTextView dans votre adaptateur.

C'est ça. En effet, vous instanciez la marge à le niveau des articles pour la ListView. Parce que ListView n'est pas au courant de la mise en page des articles - seul votre adaptateur le sait. Cela gonfle fondamentalement la partie de la disposition de l'article qui a été ignoré avant.

1
répondu jwehrle 2017-06-13 23:59:55