Android ListView Bölücü


98

Bu koda sahibim:

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

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

ama herhangi bir bölen göremiyorum.


1
Neden bilmiyorum ama kod eksik. işte yine:
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
ve liste bölücü: <şekil xmlns: android = " schemas.android.com/apk/res/android " android: shape = "line"> <strok android: width = "1dp" android: color = "# 8F8F8F" android: dashWidth = "1dp" android: dashGap = "1dp" /> </shape>
oriharel

özellikle XML / HTML / SGML kodu olmak üzere kodları eklemek için kod bloğunu (101010 simgesi) kullanın. Şimdilik gönderinizi düzelttim.
Lie Ryan

Belki de sorunun nedeni ListAdapter'nizdedir. Sadece bağdaştırıcının areAllItemsEnabled () değerini döndürmeyi deneyin. Veya stackoverflow.com/questions/5587826/…
grine4ka

Yanıtlar:


176

Arkadaşlar, işte bu yüzden 1dp veya 1dip yerine 1px kullanmalısınız: 1dp veya 1dip belirtirseniz, Android bunu küçültecektir. 120dpi'lik bir cihazda bu, 0,75 piksel olarak çevrilen ve 0'a yuvarlanan bir şeye dönüşür. Bazı cihazlarda 2-3 piksele çevrilir ve genellikle çirkin veya özensiz görünür.

Bölücüler için, 1 piksellik bir bölücü istiyorsanız 1px doğru yüksekliktir ve "her şey daldırmalı" kuralı için istisnalardan biridir. Tüm ekranlarda 1 piksel olacaktır. Ayrıca, 1px genellikle hdpi ve üzeri ekranlarda daha iyi görünür

"Artık 2012 değil" düzenlemesi: belirli bir ekran yoğunluğundan başlayarak dp / dip'e geçmeniz gerekebilir


4
Vay. Hayatımı kurtardı. "Dip" kullanmak için Android'in resmi kılavuzunun bir parçası olmalıdır
deeJ

Katılıyorum. En azından neden sahip olduklarına bir örnek olarak px hakkındaki bu kuralı belirtmeliler.
Joe Plante

6
Ldpi'de, 1dp = 0,75 piksel, bu nedenle 0'a yuvarlanır. Bölücü daha sonra çizilmez, bu da diğerleri için sorun yaratabilir. Bu aynı zamanda bu ileti dizisindeki tüm piksel kullanımından şikayetçi olan diğer ifadelere de başvurur. Bu, sorununun çözümü olabilir veya olmayabilir ve bunun olup olmadığını beyan etmek ona kalmış
Joe Plante

18
1px, bir xxhdpi cihazında inanılmaz derecede küçük olacak ve bir noktada (cihazlar daha yüksek yoğunluk almaya devam ettikçe) görülemeyecek kadar küçük olacak. Dip bunu önler ve ldpi aygıtları için başka bir çözüm, değerler-ldpi klasöründe 1px ve daha yüksek yoğunluklar için 1dip kullanmaktır.
eski

2
Bu yanıtı gönderdiğimde, xxhdpi sanırım yeni çıkıyordu. Ancak, gönderiniz özellikle ufukta xxxhdpi ve muhtemelen xxxxhdpi olduğunda mantıklı geliyor
Joe Plante

55

Bu geçici bir çözüm, ancak benim için çalışıyor:

Res / drawable / divider.xml aşağıdaki gibi oluşturuldu:

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

Listview öğesi için styles.xml dosyasına aşağıdaki satırları ekledim:

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

Önemli olan kısım, bu 1px ayarını eklemekti. Elbette, drawable (1px ile) gradyan kullanır ve bu en uygun çözüm değildir. İnme kullanmayı denedim ama işe yaramadı. (Stil kullanmıyor gibi görünüyorsunuz, bu nedenle ListView için android: dividerHeight = "1px" özelliğini eklemeniz yeterlidir.


14
Veya en iyi uygulama için 1 dp kullanın.
Tristan Warner-Smith

2
Neden 270'lik bir açı kullanıyorsunuz? Liste bölücüler yatay çizgilerdir. 270 dikey bir gradyandır.
Christopher Perry

Bu Android'de bir hata değil mi? Bölücü olarak bir çizgi şekli işe yaramaz mı?
Diederik

8
1px varlıklar kuralın istisnasıdır
Joe Plante

1
@ TristanWarner-Smith bu yanlış. bu durumda 1px kullanmanız gerekir. kabul edilen cevabı görün.
mpellegr

27

Ekle android:dividerHeight="1px"ve çalışacak:

<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

Karşılaştığınız problem, android'i kaçırdığınız gerçeğinden kaynaklanıyor: ihtiyacınız olan dividerHeight ve çekilebilir ürününüzde bir çizgi ağırlığı belirlemeye çalıştığınız gerçeği, bazılarında bölücülerle yapamazsınız. garip bir sebep. Esasen örneğinizin işe yaraması için aşağıdaki gibi bir şey yapabilirsiniz:

Çekilebilir ürününüzü dikdörtgen veya çizgi olarak oluşturun, ya da üzerinde herhangi bir boyut ayarlamayı deneyemezsiniz, yani:

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

VEYA:

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

Ardından özel bir stil oluşturun (sadece bir tercih ama malzemeleri yeniden kullanabilmeyi seviyorum)

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

Son olarak, özel stili kullanarak liste görünümünüzü bildirin:

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

Bana haber vermezseniz, bu parçacıkları nasıl kullanacağınızı bildiğinizi varsayıyorum. Temel olarak sorunuzun cevabı, çekmecede bölücü kalınlığını ayarlayamamanız, orada genişliği tanımsız bırakmanız ve bunun yerine android: dividerHeight'ı kullanmanız gerektiğidir.


8

Dokümandan:

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

Bölücünün setDividerHeight()iç yüksekliği yoksa ortaya çıkması için çağrılması gerekiyor gibi görünüyor


5

Şöyle @drawable/list_dividegörünmelisin:

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

Sürümünüzde bir android:width="1dp"sağlarsınız, basitçe bir ile değiştirin android:height="1dp"ve çalışmalıdır!


5
android: height, kontur için geçerli bir özellik değildir ve genişlik yalnızca konturun ne kadar uzun olduğu değil, ne kadar geniş olduğu anlamına gelir. "Çözümünüzün" çalışmasının tek nedeni, Android'in bu yükseklik değerini tanımamasıdır.
Justin Buser

4

Gönderen doc :

dosya konumu:

res / drawable / dosyaadı.xml

Dosya adı kaynak numarası olarak kullanılmaktadır .

temel olarak, şu adla erişebilmeniz için list_divider.xmliçinde bir dosya koymanız gerekir ; Bu şekilde erişebiliyorsanız , XML'de kullanabilirsiniz .res/drawable/R.drawable.list_dividerandroid:divider="@drawable/list_divider"ListView


Tutulma ile çalışıyorum, bu yüzden bunu yapmasaydım kod derlenmezdi. bu nedenle, dosya yerinde olduğunda, liste görünümü hala benim özel bölücümü yok sayıyor gibi görünüyor.
oriharel

2

Bazı insanlar sağlam bir çizgi yaşıyor olabilir. android:layerType="software"Çekilebilir olanı referans alan görünüme ekleyerek bunu aştım.


1

Android dokümanları, yuvarlama hatası nedeniyle kaybolan şeyler hakkında uyarıda bulunur ... Belki px yerine dp'yi deneyin ve belki de yuvarlama sorunu olup olmadığını görmek için önce> 1'i deneyin.

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

"1 piksel yüksekliği / genişliği olan resimler" bölümü için


Evet. 2 veya daha fazla dp / dip kullanıyorsanız, o zaman iyisiniz. Ancak, sadece bu 1 piksellik bölücüyü istiyorsanız, gidilecek yol px'dir. Ayrıca 1px ile daha fazla ekran alanı elde edersiniz, ayrıca 1px genellikle daha iyi görünür
Joe Plante

1

Ben de aynı sorunu yaşadım. Ancak görünümü 1px yapmak orijinal Nexus 7'mde işe yaramıyor gibi görünmüyordu. Ekran yoğunluğunun 213 olduğunu ve bu xhdpi'de kullanılan 240'tan daha az olduğunu fark ettim. Yani cihazın mdpi yoğunluğu olduğunu düşünüyordu.

Benim çözümüm, dimensklasörün bir dividerHeightparametresi olacak şekilde onu yapmaktı . Ben ayarlayın 2dpiçinde values-mdpiklasöründe ama 1dpiçinde values-hdpivb klasörler.


1

bölücü xml düzeninizde bölücünün sonunda bir "r" unuttunuz

layout @ drawable / list_divider olarak adlandırırsınız ancak bölücü xml'niz "list_divide" olarak adlandırılır


-1

android ayarla: dividerHeight = "1 dp"

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.