Divisor ListView de Android

97

Tengo este codigo:

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

donde @drawable/list_divideresta:

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

pero no puedo ver ningún divisor.

oriharel
fuente
1
No sé por qué, pero falta el código. aquí está de nuevo:
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
y el divisor de lista es: <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
utilice el bloque de código (el icono 101010) para insertar códigos, especialmente código XML / HTML / SGML. He arreglado tu publicación por ahora.
Lie Ryan
Tal vez la razón de su problema esté en su ListAdapter. Solo intente devolver verdadero de areAllItemsEnabled () del adaptador. O mira stackoverflow.com/questions/5587826/…
grine4ka

Respuestas:

175

Amigos, esta es la razón por la que debería usar 1px en lugar de 1dp o 1dip: si especifica 1dp o 1dip, Android lo reducirá. En un dispositivo de 120 ppp, eso se convierte en algo así como 0,75 px traducido, que se redondea a 0. En algunos dispositivos, eso se traduce en 2-3 píxeles, y generalmente se ve feo o descuidado

Para los divisores, 1 px es la altura correcta si desea un divisor de 1 píxel y es una de las excepciones para la regla de "todo debe estar sumergido". Será de 1 píxel en todas las pantallas. Además, 1px generalmente se ve mejor en pantallas hdpi y superiores

Edición "Ya no es 2012": es posible que tenga que cambiar a dp / dip comenzando con una cierta densidad de pantalla

Joe Plante
fuente
4
Guau. Salvó mi vida. Debería ser parte de la guía oficial de Android para usar "dip"
deeJ
Estoy de acuerdo. Deberían al menos mencionar esa regla sobre px como un ejemplo de por qué la tienen.
Joe Plante
6
En ldpi, 1dp = 0,75 píxeles, por lo tanto, se redondea hacia abajo a 0. El divisor no se dibuja, lo que puede plantear problemas a los demás. Esto también se refiere a las otras declaraciones en este hilo que se quejan de usar px por completo. Esta puede ser o no la solución a su problema y depende de él declarar si lo es o no
Joe Plante
18
1px será increíblemente pequeño en un dispositivo xxhdpi, y en algún momento (a medida que los dispositivos continúen obteniendo una mayor densidad) será demasiado pequeño para verlo. Dip evita esto, y otra solución para los dispositivos ldpi es usar 1px en la carpeta values-ldpi y 1dip para densidades más altas.
eski
2
Cuando publiqué esa respuesta, creo que xxhdpi estaba saliendo. Sin embargo, su publicación tiene sentido, especialmente con xxxhdpi y posiblemente xxxxhdpi en el horizonte
Joe Plante
54

Esta es una solución alternativa, pero me funciona:

Creado res / drawable / divider.xml de la siguiente manera:

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

Y en styles.xml para el elemento listview, agregué las siguientes líneas:

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

La parte crucial fue incluir esta configuración de 1px. Por supuesto, drawable usa gradiente (con 1px) y esa no es la solución óptima. Intenté usar el accidente cerebrovascular pero no lo conseguí. (Parece que no usa estilos, así que simplemente agregue el atributo android: dividerHeight = "1px" para ListView.

Mika Vatanen
fuente
14
O use 1dp para las mejores prácticas.
Tristan Warner-Smith
2
¿Por qué estás usando un ángulo de 270? Los divisores de listas son líneas horizontales. 270 es un gradiente vertical.
Christopher Perry
¿No es esto un error en Android? ¿No debería funcionar una forma de línea como divisor?
Diederik
8
Los recursos de 1 px son la excepción a la regla
Joe Plante
1
@ TristanWarner-Smith esto es incorrecto. necesita usar 1px en este caso. ver la respuesta aceptada.
mpellegr
26

Agregue android:dividerHeight="1px"y funcionará:

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

El problema que tiene se debe al hecho de que le falta android: dividerHeight, que necesita, y al hecho de que está tratando de especificar un grosor de línea en su elemento de dibujo, lo que no puede hacer con divisores para algunos extraña razón. Básicamente, para que su ejemplo funcione, puede hacer algo como lo siguiente:

Cree su dibujable como un rectángulo o una línea, ya sea que funcione, simplemente no puede intentar establecer ninguna dimensión en él, por lo que tampoco:

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

O:

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

Luego crea un estilo personalizado (solo una preferencia, pero me gusta poder reutilizar cosas)

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

Finalmente declare su vista de lista usando el estilo personalizado:

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

Supongo que sabe cómo usar estos fragmentos, si no, avíseme. Básicamente, la respuesta a su pregunta es que no puede establecer el grosor del divisor en el dibujable, debe dejar el ancho sin definir allí y usar android: dividerHeight para configurarlo.

Justin Buser
fuente
8

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

Parece que se setDividerHeight()debe llamar para que aparezca el divisor si no tiene altura intrínseca

Plantage
fuente
5

Su @drawable/list_dividedebe tener este aspecto:

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

En su versión, proporciona un android:width="1dp", simplemente cámbielo a un android:height="1dp"y debería funcionar.

cristiano
fuente
5
android: height no es un atributo válido para el trazo, y el ancho solo significa qué tan ancho es el trazo, no qué tan largo es. La única razón por la que su "solución" funciona es que Android no reconoce ese valor de altura.
Justin Buser
4

Del doc :

ubicación del archivo:

res / drawable / filename.xml

El nombre de archivo se utiliza como ID de recurso .

Básicamente, usted tiene que poner un archivo llamado list_divider.xmlen res/drawable/lo que puede acceder a él como R.drawable.list_divider; si puede acceder a él de esa manera, puede usar android:divider="@drawable/list_divider"en el XML para ListView.

Mentira Ryan
fuente
Trabajo con eclipse, así que si no lo hubiera hecho, el código no se compilaría. entonces, con el archivo en su lugar, todavía parece que la vista de lista ignora mi divisor personalizado.
oriharel
2

Algunas personas pueden estar experimentando una línea continua. Lo solucioné agregando android:layerType="software"a la vista que hacía referencia al dibujable.

JeremyDay
fuente
1

Los documentos de Android advierten sobre cosas que desaparecen debido a un error de redondeo ... Quizás intente dp en lugar de px, y quizás también intente> 1 primero para ver si es el problema de redondeo.

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

para la sección "Imágenes con 1 píxel de altura / ancho"

dnunn0
fuente
Sí. SI está usando 2 o más dp / dip, entonces está bien. Sin embargo, si solo desea ese divisor de 1 píxel, px es el camino a seguir. También obtiene más espacio en la pantalla con 1px, más 1px generalmente se ve mejor
Joe Plante
1

Tuve el mismo problema. Sin embargo, hacer la vista de 1px no parecía funcionar en mi Nexus 7 original. Noté que la densidad de la pantalla era 213, que es menor que los 240 utilizados en xhdpi. Entonces pensaba que el dispositivo tenía una densidad mdpi.

Mi solución fue hacer que la dimenscarpeta tuviera un dividerHeightparámetro. Lo configuré 2dpen la values-mdpicarpeta pero 1dpen las values-hdpicarpetas etc.

RCB
fuente
1

olvidó una "r" al final del divisor en su diseño xml de divisor

llamas al diseño @ drawable / list_divider pero tu divisor xml se llama "list_divide"

KC
fuente
-1

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