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?
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").
peut-être divider
ou dividerHeight
propriété de la ListView
peut résoudre votre problème.
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>
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
.
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
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>
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"/>
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.
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 .
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
juste android: divider= "@null " et fournir la hauteur au divider fait pour moi.
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>
<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.
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 :-)
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"/>
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
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.
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.