Android ListView Divider

97

Ich habe diesen 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>

wo @drawable/list_dividerist:

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

aber ich kann keinen Teiler sehen.

Oriharel
quelle
1
Ich weiß nicht warum, aber der Code fehlt. hier ist es wieder:
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
und der Listenteiler ist: <shape xmlns: android = " schemas.android.com/apk/res/android " android: shape = "line"> <Strich android: width = "1dp" android: color = "# 8F8F8F" android: dashWidth = "1dp" android: dashGap = "1dp" /> </ form>
oriharel
Verwenden Sie den Codeblock (das 101010-Symbol) zum Einfügen von Codes, insbesondere von XML / HTML / SGML-Code. Ich habe deinen Beitrag jetzt repariert.
Lie Ryan
Möglicherweise liegt der Grund für Ihr Problem in Ihrem ListAdapter. Versuchen Sie einfach, true von areAllItemsEnabled () des Adapters zurückzugeben. Oder schauen Sie sich stackoverflow.com/questions/5587826/…
grine4ka

Antworten:

175

Leute, hier ist der Grund, warum Sie 1px anstelle von 1dp oder 1dip verwenden sollten: Wenn Sie 1dp oder 1dip angeben, wird dies von Android verkleinert. Auf einem 120-dpi-Gerät wird dies zu einer Übersetzung von 0,75 Pixel, die auf 0 gerundet wird. Auf einigen Geräten bedeutet dies 2-3 Pixel, und es sieht normalerweise hässlich oder schlampig aus

Für Teiler ist 1px die richtige Höhe, wenn Sie einen 1-Pixel-Teiler möchten, und ist eine der Ausnahmen für die Regel "Alles sollte eintauchen". Auf allen Bildschirmen wird 1 Pixel angezeigt. Außerdem sieht 1px auf HDPI-Bildschirmen und höher normalerweise besser aus

Bearbeiten "Es ist nicht mehr 2012": Möglicherweise müssen Sie ab einer bestimmten Bildschirmdichte auf dp / dip umschalten

Joe Plante
quelle
4
Beeindruckend. Hat mein Leben gerettet. Sollte Teil des offiziellen Android-Handbuchs zur Verwendung von "dip" sein
deeJ
Genau. Sie sollten zumindest diese Regel über px als Beispiel dafür erwähnen, warum sie sie haben.
Joe Plante
6
Auf ldpi wird 1dp = 0,75 Pixel, daher auf 0 abgerundet. Der Teiler wird dann nicht gezeichnet, was für andere Probleme bereiten kann. Dies bezieht sich auch auf die anderen Aussagen in diesem Thread, die sich über die Verwendung von px insgesamt beschweren. Dies kann oder kann nicht die Lösung für sein Problem sein und es liegt an ihm zu erklären, ob es ist oder nicht
Joe Plante
18
1px wird auf einem xxhdpi-Gerät unglaublich klein sein, und irgendwann (da Geräte immer dichter werden) wird es zu klein sein, um überhaupt gesehen zu werden. Dip vermeidet dies, und eine andere Lösung für ldpi-Geräte besteht darin, 1px im Ordner values-ldpi und 1dip für höhere Dichten zu verwenden.
Eski
2
Als ich diese Antwort gepostet habe, kam xxhdpi, glaube ich, gerade heraus. Ihr Beitrag ist jedoch sinnvoll, insbesondere mit xxxhdpi und möglicherweise xxxxhdpi am Horizont
Joe Plante
54

Dies ist eine Problemumgehung, funktioniert aber für mich:

Res / drawable / divider.xml wurde wie folgt erstellt:

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

Und in styles.xml für Listenansicht habe ich die folgenden Zeilen hinzugefügt:

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

Entscheidend war, diese 1px-Einstellung aufzunehmen. Natürlich verwendet Drawable einen Farbverlauf (mit 1 Pixel) und das ist nicht die optimale Lösung. Ich habe versucht, Schlaganfall zu verwenden, aber es hat nicht funktioniert. (Sie scheinen keine Stile zu verwenden, also fügen Sie einfach das Attribut android: dividerHeight = "1px" für die ListView hinzu.

Mika Vatanen
quelle
14
Oder verwenden Sie 1dp als Best Practice.
Tristan Warner-Smith
2
Warum verwenden Sie einen Winkel von 270? Listenteiler sind horizontale Linien. 270 ist ein vertikaler Gradient.
Christopher Perry
Ist das nicht ein Fehler in Android? Sollte eine Linienform als Teiler nicht einfach funktionieren?
Diederik
8
1px Assets sind die Ausnahme von der Regel
Joe Plante
1
@ TristanWarner-Smith das ist falsch. In diesem Fall müssen Sie 1px verwenden. siehe die akzeptierte Antwort.
mpellegr
26

Hinzufügen android:dividerHeight="1px"und es wird funktionieren:

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

Das Problem, das Sie haben, rührt von der Tatsache her, dass Sie android: dividerHeight vermissen, das Sie benötigen, und der Tatsache, dass Sie versuchen, eine Strichstärke in Ihrem Drawable anzugeben, was Sie mit Teilern für einige nicht tun können seltsamer Grund. Um Ihr Beispiel zum Laufen zu bringen, können Sie im Wesentlichen Folgendes tun:

Erstellen Sie Ihr Zeichenobjekt entweder als Rechteck oder als Linie. In beiden Fällen können Sie einfach nicht versuchen, Bemaßungen festzulegen.

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

ODER:

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

Erstellen Sie dann einen benutzerdefinierten Stil (nur eine Präferenz, aber ich möchte in der Lage sein, Sachen wiederzuverwenden)

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

Deklarieren Sie abschließend Ihre Listenansicht mit dem benutzerdefinierten Stil:

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

Ich gehe davon aus, dass Sie wissen, wie man diese Schnipsel verwendet, wenn nicht, lassen Sie es mich wissen. Grundsätzlich lautet die Antwort auf Ihre Frage, dass Sie die Teilerdicke im Zeichenelement nicht festlegen können. Sie müssen die Breite dort undefiniert lassen und stattdessen android: dividerHeight verwenden, um sie festzulegen.

Justin Buser
quelle
8

Aus dem Dokument:

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.
 */

Sieht so aus setDividerHeight(), als müsste aufgerufen werden, damit der Teiler angezeigt wird, wenn er keine Eigenhöhe hat

Plantage
quelle
5

Du @drawable/list_dividesolltest so aussehen:

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

In Ihrer Version geben Sie ein an android:width="1dp", ändern Sie android:height="1dp"es einfach in ein und es sollte funktionieren!

Christian
quelle
5
android: height ist kein gültiges Attribut für Striche und width bedeutet nur, wie breit der Strich ist, nicht wie lang er ist. Der einzige Grund, warum Ihre "Lösung" funktioniert, ist, dass Android diesen Höhenwert nicht erkennt.
Justin Buser
4

Aus dem Dokument :

Speicherort:

res / drawable / filename.xml

Der Dateiname wird als Ressourcen-ID verwendet .

Grundsätzlich müssen Sie eine Datei mit dem Namen list_divider.xmleinfügen, res/drawable/damit Sie darauf zugreifen können R.drawable.list_divider. Wenn Sie auf diese Weise darauf zugreifen können, können Sie android:divider="@drawable/list_divider"in der XML für verwenden ListView.

Lie Ryan
quelle
Ich arbeite mit Eclipse. Wenn ich das nicht getan hätte, würde der Code nicht kompiliert. Wenn die Datei vorhanden ist, scheint die Listenansicht meinen benutzerdefinierten Teiler immer noch zu ignorieren.
Oriharel
2

Einige Leute haben möglicherweise eine durchgezogene Linie. Ich habe dies android:layerType="software"umgangen, indem ich der Ansicht, die auf das Zeichenobjekt verweist, etwas hinzugefügt habe.

JeremyDay
quelle
1

Die Android-Dokumente warnen vor dem Verschwinden von Dingen aufgrund eines Rundungsfehlers ... Versuchen Sie es vielleicht mit dp anstelle von px, und versuchen Sie vielleicht auch zuerst> 1, um festzustellen, ob es sich um das Rundungsproblem handelt.

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

für den Abschnitt "Bilder mit 1 Pixel Höhe / Breite"

dnunn0
quelle
Ja. Wenn Sie 2 oder mehr dp / dip verwenden, sind Sie in Ordnung. Wenn Sie jedoch nur diesen 1-Pixel-Teiler möchten, ist px der richtige Weg. Sie erhalten auch mehr Bildschirmfläche mit 1px, plus 1px sieht normalerweise besser aus
Joe Plante
1

Ich hatte das gleiche Problem. Das Erstellen der Ansicht 1px schien jedoch auf meinem ursprünglichen Nexus 7 nicht zu funktionieren. Ich bemerkte, dass die Bildschirmdichte 213 betrug, was weniger als die in xhdpi verwendeten 240 ist. Es wurde also angenommen, dass das Gerät eine MDPI-Dichte hat.

Meine Lösung bestand darin, es so zu gestalten, dass der dimensOrdner einen dividerHeightParameter hatte. Ich habe es 2dpim values-mdpiOrdner aber 1dpin den values-hdpiOrdnern etc eingestellt.

RCB
quelle
1

Sie haben ein "r" am Ende des Teilers in Ihrem XML-Layout des Teilers vergessen

Sie nennen das Layout @ drawable / list_divider, aber Ihre Divider-XML heißt "list_divide".

KC
quelle
-1

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