Divisore ListView Android


98

Ho questo codice:

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

dov'è @drawable/list_divider:

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

ma non vedo nessun divisore.


1
Non so perché ma manca il codice. eccolo di nuovo:
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
e il divisore dell'elenco è: <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

utilizzare il blocco di codice (l'icona 101010) per inserire codici, in particolare codice XML / HTML / SGML. Ho corretto il tuo post per ora.
Lie Ryan

Forse il motivo del tuo problema è nel tuo ListAdapter. Prova a restituire true per areAllItemsEnabled () dell'adattatore. O guardare stackoverflow.com/questions/5587826/...
grine4ka

Risposte:


176

Ragazzi, ecco perché dovreste usare 1px invece di 1dp o 1dip: se specifichi 1dp o 1dip, Android lo ridimensionerà. Su un dispositivo da 120 dpi, la traduzione diventa qualcosa come 0,75 px, che viene arrotondato a 0. Su alcuni dispositivi, ciò si traduce in 2-3 pixel e di solito sembra brutto o sciatto

Per i divisori, 1px è l'altezza corretta se vuoi un divisore di 1 pixel ed è una delle eccezioni per la regola "tutto dovrebbe essere dip". Sarà 1 pixel su tutti gli schermi. Inoltre, 1px di solito ha un aspetto migliore su hdpi e schermi superiori

Modifica "Non è più il 2012": potresti dover passare a dp / dip a partire da una certa densità dello schermo


4
Wow. Salvato la mia vita. Dovrebbe far parte della guida ufficiale di Android per utilizzare "dip"
deeJ

Sono d'accordo. Dovrebbero almeno menzionare quella regola su px come esempio del motivo per cui lo hanno.
Joe Plante

6
Su ldpi, 1dp = 0,75 pixel, quindi arrotonda per difetto a 0. Il divisore quindi non viene disegnato, il che può creare problemi per gli altri. Questo si riferisce anche alle altre dichiarazioni in questo thread che si lamentano dell'uso totale di px. Questa può o non può essere la soluzione al suo problema e spetta a lui dichiarare se lo è o meno
Joe Plante

18
1px sarà incredibilmente piccolo su un dispositivo xxhdpi e ad un certo punto (poiché i dispositivi continuano a ottenere una densità maggiore) sarà troppo piccolo per essere visto. Dip lo evita e un'altra soluzione per i dispositivi ldpi è usare 1px nella cartella values-ldpi e 1dip per densità maggiori.
eski

2
Quando ho pubblicato quella risposta, xxhdpi penso fosse appena uscito. Tuttavia, il tuo post ha senso, soprattutto con xxxhdpi e forse xxxxhdpi all'orizzonte
Joe Plante

55

Questa è una soluzione alternativa, ma funziona per me:

Creato res / drawable / divider.xml come segue:

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

E in styles.xml per l'elemento listview, ho aggiunto le seguenti righe:

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

La parte cruciale era includere questa impostazione 1px. Ovviamente, Drawable usa il gradiente (con 1px) e questa non è la soluzione ottimale. Ho provato a usare l'ictus ma non l'ho fatto funzionare. (Non sembri utilizzare gli stili, quindi aggiungi l'attributo android: dividerHeight = "1px" per ListView.


14
Oppure usa 1dp per le migliori pratiche.
Tristan Warner-Smith

2
Perché stai usando un angolo di 270? I divisori di elenco sono linee orizzontali. 270 è un gradiente verticale.
Christopher Perry

Non è un bug in Android? Una forma di linea come divisore non dovrebbe funzionare?
Diederik

8
Le risorse 1px sono l'eccezione alla regola
Joe Plante

1
@ TristanWarner-Smith questo non è corretto. devi usare 1px in questo caso. vedere la risposta accettata.
mpellegr

27

Aggiungi android:dividerHeight="1px"e funzionerà:

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

15

Il problema che stai riscontrando deriva dal fatto che ti manca android: dividerHeight, di cui hai bisogno, e dal fatto che stai cercando di specificare uno spessore di linea nel tuo disegnabile, cosa che non puoi fare con i divisori per alcuni strano motivo. Essenzialmente per far funzionare il tuo esempio potresti fare qualcosa di simile a quanto segue:

Crea il tuo disegnabile come un rettangolo o una linea, o funziona, non puoi provare a impostare alcuna dimensione su di esso, quindi:

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

Quindi crea uno stile personalizzato (solo una preferenza ma mi piace poter riutilizzare le cose)

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

Infine dichiara la tua visualizzazione elenco utilizzando lo stile personalizzato:

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

Presumo che tu sappia come usare questi frammenti, se non fammelo sapere. Fondamentalmente la risposta alla tua domanda è che non puoi impostare lo spessore del divisore nel drawable, devi lasciare la larghezza indefinita lì e usare android: dividerHeight per impostarla invece.


8

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

Sembra che setDividerHeight()debba essere chiamato affinché il divisore venga visualizzato se non ha un'altezza intrinseca


5

Il tuo @drawable/list_dividedovrebbe apparire così:

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

Nella tua versione fornisci un android:width="1dp", semplicemente cambialo in un android:height="1dp"e dovrebbe funzionare!


5
android: l'altezza non è un attributo valido per il tratto e la larghezza indica semplicemente quanto è largo il tratto, non quanto è lungo. L'unico motivo per cui la tua "soluzione" funziona è che Android non riconosce quel valore di altezza.
Justin Buser

4

Dal doc :

posizione del file:

res / drawable / filename.xml

Il nome del file viene utilizzato come ID risorsa .

fondamentalmente, dovrai inserire un file denominato list_divider.xmlin res/drawable/modo da potervi accedere come R.drawable.list_divider; se puoi accedervi in ​​questo modo, puoi usarlo android:divider="@drawable/list_divider"nell'XML per ListView.


Lavoro con eclipse, quindi se non l'avessi fatto, il codice non si compilerebbe. quindi, con il file in posizione, sembra ancora che la visualizzazione elenco ignori il mio divisore personalizzato.
oriharel

2

Alcune persone potrebbero sperimentare una linea solida. Ho aggirato questo problema aggiungendo android:layerType="software"alla vista che fa riferimento al disegnabile.


1

La documentazione di Android avvisa che le cose scompaiono a causa di un errore di arrotondamento ... Forse prova dp invece di px, e forse prova prima> 1 per vedere se è il problema dell'arrotondamento.

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

per la sezione "Immagini con altezza / larghezza di 1 pixel"


Sì. SE stai usando 2 o più dp / dip, allora stai bene. Tuttavia, se vuoi solo quel divisore di 1 pixel, px è la strada da percorrere. Ottieni anche più spazio sullo schermo con 1px, più 1px di solito ha un aspetto migliore
Joe Plante

1

Ho avuto lo stesso problema. Tuttavia, rendere la visualizzazione 1px non sembrava funzionare sul mio Nexus 7 originale. Ho notato che la densità dello schermo era 213, che è inferiore ai 240 usati in xhdpi. Quindi pensava che il dispositivo fosse una densità mdpi.

La mia soluzione era di fare in modo che la dimenscartella avesse un dividerHeightparametro. L'ho impostato 2dpnella values-mdpicartella ma 1dpnelle values-hdpicartelle ecc.


1

hai dimenticato una "r" alla fine del divisore nel layout xml del divisore

chiami il layout @ drawable / list_divider ma il tuo divisore xml si chiama "list_divide"


-1

imposta 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.