Diviseur ListView Android

98

J'ai ce code:

<ListView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:id="@+id/cashItemsList"
     android:cacheColorHint="#00000000"
     android:divider="@drawable/list_divider"></ListView>

@drawable/list_dividerest:

<shape
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:shape="line">
 <stroke
   android:width="1dp"
   android:color="#8F8F8F"
   android:dashWidth="1dp"
   android:dashGap="1dp" />
</shape>

mais je ne vois aucun diviseur.

oriharel
la source
1
Je ne sais pas pourquoi mais le code manque. la voici encore:
oriharel
<ListView android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: id = "@ + id / cashItemsList" android: cacheColorHint = "# 00000000" android: divider = "@ drawable / list_divider"> </ListView>
oriharel
1
et le séparateur de liste est: <shape xmlns: android = " schemas.android.com/apk/res/android " android: shape = "line"> <stroke android: width = "1dp" android: color = "# 8F8F8F" android: dashWidth = "1dp" android: dashGap = "1dp" /> </shape>
oriharel
utilisez le bloc de code (l'icône 101010) pour insérer des codes, en particulier du code XML / HTML / SGML. J'ai corrigé votre message pour le moment.
Lie Ryan
Peut-être que la raison de votre problème est dans votre ListAdapter. Essayez simplement de renvoyer true pour areAllItemsEnabled () de l'adaptateur. Ou regardez stackoverflow.com/questions/5587826/…
grine4ka

Réponses:

176

Folks, voici pourquoi vous devriez utiliser 1px au lieu de 1dp ou 1dip: si vous spécifiez 1dp ou 1dip, Android réduira cela. Sur un appareil de 120 dpi, cela devient quelque chose comme 0,75px traduit, ce qui arrondit à 0. Sur certains appareils, cela se traduit par 2-3 pixels, et il semble généralement moche ou bâclé

Pour les diviseurs, 1px est la hauteur correcte si vous voulez un diviseur de 1 pixel et est l'une des exceptions pour la règle «tout devrait être creux». Ce sera 1 pixel sur tous les écrans. De plus, 1px est généralement meilleur sur les écrans hdpi et supérieurs

"Ce n'est plus 2012" edit: il se peut que vous deviez passer en dp / dip à partir d'une certaine densité d'écran

Joe Plante
la source
4
Sensationnel. Sauvé ma vie. Devrait faire partie du guide officiel d'Android pour utiliser "dip"
deeJ
Je suis d'accord. Ils devraient au moins mentionner cette règle sur px comme un exemple de pourquoi ils l'ont.
Joe Plante
6
Sur ldpi, 1dp = 0,75 pixels, arrondit donc à 0. Le diviseur ne se dessine alors pas, ce qui peut poser des problèmes aux autres. Cela fait également référence aux autres déclarations de ce fil se plaignant de l'utilisation totale de px. Cela peut ou non être la solution à son problème et c'est à lui de déclarer si oui ou non
Joe Plante
18
1px sera incroyablement petit sur un appareil xxhdpi, et à un moment donné (alors que les appareils continuent à obtenir une densité plus élevée), il sera trop petit pour être vu du tout. Dip évite cela, et une autre solution pour les périphériques ldpi consiste à utiliser 1px dans le dossier values-ldpi et 1dip pour les densités plus élevées.
eski
2
Quand j'ai posté cette réponse, xxhdpi, je pense, venait juste de sortir. Cependant, votre message a du sens, surtout avec xxxhdpi et peut-être xxxxhdpi à l'horizon
Joe Plante
55

Ceci est une solution de contournement, mais fonctionne pour moi:

Créé res / drawable / divider.xml comme suit:

<?xml version="1.0" encoding="UTF-8"?>
<shape
  xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient android:startColor="#ffcdcdcd" android:endColor="#ffcdcdcd" android:angle="270.0" />
</shape>

Et dans styles.xml pour l'élément de liste, j'ai ajouté les lignes suivantes:

    <item name="android:divider">@drawable/divider</item>
    <item name="android:dividerHeight">1px</item>

La partie cruciale était d'inclure ce paramètre 1px. Bien sûr, drawable utilise un dégradé (avec 1px) et ce n'est pas la solution optimale. J'ai essayé d'utiliser l'AVC mais je ne l'ai pas fait fonctionner. (Vous ne semblez pas utiliser de styles, alors ajoutez simplement l'attribut android: dividerHeight = "1px" pour le ListView.

Mika Vatanen
la source
14
Ou utilisez 1dp pour les meilleures pratiques.
Tristan Warner-Smith
2
Pourquoi utilisez-vous un angle de 270? Les séparateurs de liste sont des lignes horizontales. 270 est un dégradé vertical.
Christopher Perry
N'est-ce pas un bug dans Android? Une forme de ligne comme séparateur ne devrait-elle pas simplement fonctionner?
Diederik
8
Les actifs 1px sont l'exception à la règle
Joe Plante
1
@ TristanWarner-Smith c'est incorrect. vous devez utiliser 1px dans ce cas. voir la réponse acceptée.
mpellegr
27

Ajoutez android:dividerHeight="1px"et cela fonctionnera:

<ListView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:id="@+id/cashItemsList"
     android:cacheColorHint="#00000000"
     android:divider="@drawable/list_divider" android:dividerHeight="1px"></ListView>
Martijn de Bruijn
la source
15

Le problème que vous rencontrez vient du fait qu'il vous manque android: dividerHeight, dont vous avez besoin, et du fait que vous essayez de spécifier une épaisseur de ligne dans votre dessin, ce que vous ne pouvez pas faire avec des diviseurs pour certains raison étrange. Essentiellement, pour que votre exemple fonctionne, vous pouvez faire quelque chose comme ce qui suit:

Créez votre dessinable sous forme de rectangle ou de ligne, soit vous ne pouvez pas essayer de définir des dimensions dessus, donc non plus:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line">
     <stroke android:color="#8F8F8F" android:dashWidth="1dp" android:dashGap="1dp" />
</shape>

OU:

<shape xmlns:android="http://schemas.android.com/apk/res/android"  android:shape="rectangle">
     <solid android:color="#8F8F8F"/>
</shape>

Ensuite, créez un style personnalisé (juste une préférence mais j'aime pouvoir réutiliser des choses)

<style name="dividedListStyle" parent="@android:style/Widget.ListView">
    <item name="android:cacheColorHint">@android:color/transparent</item>
    <item name="android:divider">@drawable/list_divider</item>
    <item name="android:dividerHeight">1dp</item>
</style>

Enfin, déclarez votre vue de liste en utilisant le style personnalisé:

<ListView
     style="@style/dividedListStyle"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:id="@+id/cashItemsList">
</ListView>

Je suppose que vous savez comment utiliser ces extraits, sinon faites-le moi savoir. Fondamentalement, la réponse à votre question est que vous ne pouvez pas définir l'épaisseur du diviseur dans le dessin, vous devez laisser la largeur indéfinie ici et utiliser android: dividerHeight pour le définir à la place.

Justin Buser
la source
8

Du doc:

public void setDivider(Drawable divider) on ListView

/**
 * Sets the drawable that will be drawn between each item in the list. If the drawable does
 * not have an intrinsic height, you should also call {@link #setDividerHeight(int)}
 *
 * @param divider The drawable to use.
 */

On dirait qu'il setDividerHeight()doit être appelé pour que le diviseur apparaisse s'il n'a pas de hauteur intrinsèque

Plantage
la source
5

Votre @drawable/list_dividedevrait ressembler à ceci:

<shape
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:shape="line">
 <stroke
   android:height="1dp"
   android:color="#8F8F8F"
   android:dashWidth="1dp"
   android:dashGap="1dp" />
</shape>

Dans votre version, vous fournissez un android:width="1dp", changez-le simplement en un android:height="1dp"et cela devrait fonctionner!

Christian
la source
5
android: la hauteur n'est pas un attribut valide pour le trait, et la largeur signifie simplement la largeur du trait, pas sa longueur. La seule raison pour laquelle votre «solution» fonctionne est qu'Android ne reconnaît pas cette valeur de hauteur.
Justin Buser
4

Du doc :

emplacement du fichier:

res / drawable / filename.xml

Le nom de fichier est utilisé comme ID de ressource .

En gros, vous aurez besoin de mettre un fichier nommé list_divider.xmldans res/drawable/afin que vous puissiez accéder comme R.drawable.list_divider; si vous pouvez y accéder de cette façon, vous pouvez utiliser android:divider="@drawable/list_divider"dans le XML pour ListView.

Mensonge Ryan
la source
Je travaille avec eclipse, donc si je n'avais pas fait ça, le code ne serait pas compilé. ainsi, avec le fichier en place, il semble toujours que la vue de liste ignore mon diviseur personnalisé.
oriharel
2

Certaines personnes peuvent rencontrer une ligne continue. J'ai contourné cela en ajoutant android:layerType="software"à la vue faisant référence au dessinable.

JeremyJour
la source
1

La documentation Android avertit que des choses disparaissent en raison d'une erreur d'arrondi ... Essayez peut-être dp au lieu de px, et peut-être aussi essayez d'abord> 1 pour voir si c'est le problème d'arrondi.

voir http://developer.android.com/guide/practices/screens_support.html#testing

pour la section "Images avec 1 pixel hauteur / largeur"

dnunn0
la source
Oui. SI vous utilisez 2 dp / dip ou plus, vous allez bien. Cependant, si vous voulez juste ce diviseur de 1 pixel, px est la voie à suivre. Vous obtenez également plus d'espace d'écran avec 1px, plus 1px semble généralement mieux
Joe Plante
1

J'ai eu le même problème. Cependant, rendre la vue 1px ne semblait pas fonctionner sur mon Nexus 7. d'origine. J'ai remarqué que la densité de l'écran était de 213, ce qui est inférieur aux 240 utilisés dans xhdpi. On pensait donc que l'appareil avait une densité mdpi.

Ma solution était de faire en sorte que le dimensdossier ait un dividerHeightparamètre. Je l'ai mis 2dpdans le values-mdpidossier mais 1dpdans les values-hdpidossiers etc.

RCB
la source
1

vous avez oublié un "r" à la fin du diviseur dans votre mise en page XML diviseur

vous appelez le layout @ drawable / list_divider mais votre diviseur xml est nommé "list_divide"

KC
la source
-1

définir android: dividerHeight = "1dp"

<ListView
            android:id="@+id/myphnview"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@drawable/dividerheight"
            android:background="#E9EAEC"
            android:clickable="true"
    android:divider="@color/white"
                android:dividerHeight="1dp"
                android:headerDividersEnabled="true" >
    </ListView>
Nzala
la source