Android ListView Divider

98

Saya memiliki kode ini:

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

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

tapi saya tidak bisa melihat pembatas apapun.

oriharel
sumber
1
Saya tidak tahu mengapa tetapi kodenya hilang. ini dia lagi:
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
dan pembatas daftarnya adalah: <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
gunakan blok kode (icon 101010) untuk memasukkan kode, terutama kode XML / HTML / SGML. Saya telah memperbaiki postingan Anda untuk saat ini.
Lie Ryan
Mungkin alasan masalah Anda ada di ListAdapter Anda. Coba saja kembalikan true dari areAllItemsEnabled () adaptor. Atau tonton stackoverflow.com/questions/5587826/…
grine4ka

Jawaban:

176

Teman-teman, inilah mengapa Anda harus menggunakan 1px daripada 1dp atau 1dip: jika Anda menentukan 1dp atau 1dip, Android akan menurunkannya. Pada perangkat 120dpi, itu menjadi seperti diterjemahkan 0,75 piksel, yang dibulatkan menjadi 0. Di beberapa perangkat, itu diterjemahkan menjadi 2-3 piksel, dan biasanya terlihat jelek atau ceroboh

Untuk pembagi, 1 piksel adalah tinggi yang benar jika Anda menginginkan pembagi 1 piksel dan merupakan salah satu pengecualian untuk aturan "semuanya harus dip". Ini akan menjadi 1 piksel di semua layar. Plus, 1px biasanya terlihat lebih baik pada layar hdpi dan di atasnya

Edit "Ini bukan tahun 2012 lagi": Anda mungkin harus beralih ke dp / dip mulai dari kepadatan layar tertentu

Joe Plante
sumber
4
Wow. Menyelamatkan hidupku. Harus menjadi bagian dari panduan resmi Android untuk menggunakan "dip"
deeJ
Saya setuju. Mereka setidaknya harus menyebutkan aturan tentang px sebagai contoh mengapa mereka memilikinya.
Joe Plante
6
Pada ldpi, 1dp = 0,75 piksel, oleh karena itu dibulatkan ke 0. Pembagi tidak akan digambar, yang dapat menimbulkan masalah bagi orang lain. Ini juga mengacu pada pernyataan lain di utas ini yang mengeluh tentang penggunaan px sama sekali. Ini mungkin atau mungkin bukan solusi untuk masalahnya dan terserah dia untuk menyatakan apakah itu benar atau tidak
Joe Plante
18
1px akan menjadi sangat kecil pada perangkat xxhdpi, dan pada titik tertentu (karena perangkat terus mendapatkan kepadatan yang lebih tinggi) akan menjadi terlalu kecil untuk dilihat sama sekali. Dip menghindari ini, dan solusi lain untuk perangkat ldpi adalah menggunakan 1px di folder values-ldpi, dan 1dip untuk kepadatan yang lebih tinggi.
eski
2
Ketika saya memposting tanggapan itu, xxhdpi saya pikir baru saja keluar. Namun, posting Anda masuk akal, terutama dengan xxxhdpi dan mungkin xxxxhdpi di cakrawala
Joe Plante
55

Ini adalah solusi, tetapi berhasil untuk saya:

Membuat res / drawable / divider.xml sebagai berikut:

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

Dan di styles.xml untuk item listview, saya menambahkan baris berikut:

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

Bagian terpenting adalah memasukkan pengaturan 1px ini. Tentu saja, drawable menggunakan gradien (dengan 1px) dan itu bukan solusi optimal. Saya mencoba menggunakan stroke tetapi tidak berhasil. (Anda tampaknya tidak menggunakan gaya, jadi tambahkan saja atribut android: dividerHeight = "1px" untuk ListView.

Mika Vatanen
sumber
14
Atau gunakan 1dp untuk praktik terbaik.
Tristan Warner-Smith
2
Mengapa Anda menggunakan sudut 270? Pembagi daftar adalah garis horizontal. 270 adalah gradien vertikal.
Christopher Perry
Bukankah ini bug di Android? Bukankah seharusnya bentuk garis sebagai pembatas berfungsi begitu saja?
Diederik
8
Aset 1px adalah pengecualian dari aturan
Joe Plante
1
@ TristanWarner-Smith ini salah. Anda perlu menggunakan 1px dalam kasus ini. lihat jawaban yang diterima.
mpellegr
27

Tambahkan android:dividerHeight="1px"dan itu akan berhasil:

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

Masalah yang Anda alami berasal dari fakta bahwa Anda kehilangan android: dividerHeight, yang Anda perlukan, dan fakta bahwa Anda mencoba menentukan bobot garis dalam drawable, yang tidak dapat Anda lakukan dengan pembagi untuk beberapa alasan aneh. Pada dasarnya agar contoh Anda berhasil, Anda dapat melakukan sesuatu seperti berikut:

Buat drawable Anda baik sebagai persegi panjang atau garis, baik itu berfungsi, Anda tidak dapat mencoba mengatur dimensi apa pun di atasnya, jadi:

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

ATAU:

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

Kemudian buat gaya khusus (hanya preferensi tetapi saya ingin dapat menggunakan kembali barang)

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

Terakhir, nyatakan tampilan daftar Anda menggunakan gaya kustom:

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

Saya berasumsi Anda tahu cara menggunakan cuplikan ini, jika tidak beri tahu saya. Pada dasarnya, jawaban atas pertanyaan Anda adalah Anda tidak dapat menyetel ketebalan pembagi dalam drawable, Anda harus membiarkan lebarnya tidak ditentukan di sana dan menggunakan android: dividerHeight untuk menyetelnya.

Justin Buser
sumber
8

Dari dokumen:

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

Sepertinya setDividerHeight()harus dipanggil agar pembatas muncul jika tidak memiliki tinggi intrinsik

Plantage
sumber
5

Anda @drawable/list_divideakan terlihat seperti ini:

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

Dalam versi Anda, Anda menyediakan android:width="1dp", cukup ubah menjadi android:height="1dp"dan itu akan berfungsi!

Kristen
sumber
5
android: height bukanlah atribut yang valid untuk guratan, dan lebarnya hanya berarti seberapa lebar guratannya, bukan panjangnya. Satu-satunya alasan "solusi" Anda berfungsi adalah karena Android tidak mengenali nilai ketinggian tersebut.
Justin Buser
4

Dari dokumen :

lokasi file:

res / drawable / filename.xml

Nama file digunakan sebagai ID sumber daya .

pada dasarnya, Anda harus menempatkan sebuah file bernama list_divider.xmldalam res/drawable/sehingga Anda dapat mengaksesnya sebagai R.drawable.list_divider; jika Anda dapat mengaksesnya dengan cara itu, maka Anda dapat menggunakan android:divider="@drawable/list_divider"XML untuk ListView.

Lie Ryan
sumber
Saya bekerja dengan eclipse, jadi jika saya tidak melakukannya, kode tidak akan dapat dikompilasi. jadi, dengan file di tempatnya, tampilan daftar masih mengabaikan pembagi kustom saya.
oriharel
2

Beberapa orang mungkin mengalami garis yang solid. Saya mengatasi ini dengan menambahkan android:layerType="software"ke tampilan yang mereferensikan drawable.

JeremyDay
sumber
1

Dokumen android memperingatkan tentang hal-hal yang menghilang karena kesalahan pembulatan ... Mungkin coba dp daripada px, dan mungkin juga coba> 1 terlebih dahulu untuk melihat apakah itu masalah penyelesaian.

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

untuk bagian "Gambar dengan tinggi / lebar 1 piksel"

dnunn0
sumber
Ya. JIKA Anda menggunakan 2 atau lebih dp / dip, maka Anda baik-baik saja. Namun, jika Anda hanya menginginkan pembagi 1-piksel itu, px adalah cara yang tepat. Anda juga mendapatkan lebih banyak real-estate layar dengan 1px, ditambah 1px biasanya terlihat lebih baik
Joe Plante
1

Saya memiliki masalah yang sama. Namun membuat tampilan 1px sepertinya tidak bekerja pada Nexus 7 asli saya. Saya perhatikan bahwa kerapatan layar adalah 213 yang kurang dari 240 yang digunakan dalam xhdpi. Jadi saya pikir perangkat itu memiliki kepadatan mdpi.

Solusi saya adalah membuatnya jadi dimensfolder memiliki dividerHeightparameter. Saya mengaturnya ke 2dpdalam values-mdpifolder tetapi 1dpdi values-hdpifolder dll.

RCB
sumber
1

Anda lupa "r" di ujung pembagi dalam tata letak xml pembagi Anda

Anda memanggil layout @ drawable / list_divider tetapi pembagi Anda xml diberi nama "list_divide"

KC
sumber
-1

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