web-dev-qa-db-fra.com

Android ListView Divider

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_divider est:

<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 pas de diviseur.

96
oriharel

Chers amis, voici pourquoi vous devriez utiliser 1px au lieu de 1dp ou 1dip: si vous spécifiez 1dp ou 1dip, Android réduira cette réduction. Sur un périphérique de 120dpi, cela devient quelque chose comme 0.75px traduit, qui arrondit à 0. Sur certains appareils, cela se traduit par 2-3 pixels, et il semble généralement moche ou négligée

Pour les diviseurs, 1px est la hauteur correcte si vous souhaitez un diviseur de 1 pixel et constitue l’une des exceptions à la règle "tout devrait être en plongée". Ce sera 1 pixel sur tous les écrans. De plus, 1px semble généralement mieux sur les écrans HDPI et au-dessus

Edit "Ce n'est plus 2012": vous devrez peut-être passer à dp/dip à partir d'une certaine densité d'écran

175
Joe Plante

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 listview, j'ai ajouté les lignes suivantes:

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

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

53
Mika Vatanen

Ajouter Android:dividerHeight="1px" et ça va marcher:

<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>
26
Martijn de Bruijn

Le problème que vous rencontrez provient du fait qu'il vous manque Android: dividerHeight, dont vous avez besoin, et du fait que vous essayez de spécifier une épaisseur de trait dans votre dessin, ce que vous ne pouvez pas utiliser avec des diviseurs. étrange raison. Essentiellement, pour que votre exemple fonctionne, vous pouvez effectuer les opérations suivantes:

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

<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>

Puis créez un style personnalisé (juste une préférence mais j'aime bien 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 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 laissez-moi savoir. En gros, la réponse à votre question est que vous ne pouvez pas définir l'épaisseur du diviseur dans le dessin, vous devez y laisser la largeur indéfinie et utiliser Android: dividerHeight pour la définir à la place.

15
Justin Buser

De la 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 que setDividerHeight() doit être appelé pour que le diviseur apparaisse s'il n'a pas de hauteur intrinsèque

8
Plantage

Votre @drawable/list_divide devrait 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 ça devrait marcher!

5
Christian

De la doc :

emplacement du fichier:

res/drawable/filename.xml

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

fondamentalement, vous aurez besoin de mettre un fichier nommé list_divider.xml dans res/drawable/ afin que vous puissiez y accéder en tant que 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.

4
Lie Ryan

Certaines personnes pourraient avoir une ligne solide. J'ai contourné cela en ajoutant Android:layerType="software" à la vue référençant le dessinable.

2
JeremyDay

J'ai eu le même problème. Cependant, 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 à 240 pixels utilisés dans xhdpi. Donc, je pensais que l'appareil était une densité mdpi.

Ma solution consistait à faire en sorte que le dossier dimens ait un paramètre dividerHeight. Je l'ai réglé sur 2dp Dans le dossier values-mdpi Mais sur 1dp Dans le dossier values-hdpi, Etc.

1
RCB

Les docs Android avertissent que des choses disparaissent en raison d'une erreur d'arrondi ... Essayez peut-être dp au lieu de px, et essayez également> 1 en premier 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"

1
dnunn0

vous avez oublié un "r" à la fin du séparateur dans la présentation XML de votre séparateur

vous appelez le layout @ drawable/list_divider mais votre diviseur xml s'appelle "list_divide"

1
K C