Podział widoku listy Android

98

Mam ten kod:

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

gdzie @drawable/list_dividerjest:

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

ale nie widzę żadnej rozdzielacza.

oriharel
źródło
1
Nie wiem dlaczego, ale brakuje kodu. oto znowu:
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
a dzielnik listy to: <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
użyj bloku kodu (ikona 101010) do wstawiania kodów, zwłaszcza kodu XML / HTML / SGML. Naprawiłem na razie twój post.
Lie Ryan
Może przyczyna twojego problemu znajduje się w twoim ListAdapter. Po prostu spróbuj zwrócić true dla właściwości areAllItemsEnabled () adaptera. Lub obejrzyj stackoverflow.com/questions/5587826/…
grine4ka

Odpowiedzi:

176

Ludzie, oto dlaczego powinieneś użyć 1px zamiast 1dp lub 1dip: jeśli określisz 1dp lub 1dip, Android zmniejszy to. Na urządzeniu o rozdzielczości 120 dpi jest to tłumaczone na mniej więcej 0,75 piksela, co zaokrągla do 0. Na niektórych urządzeniach przekłada się to na 2-3 piksele i zwykle wygląda brzydko lub niechlujnie

W przypadku dzielników 1px jest prawidłową wysokością, jeśli chcesz mieć separator 1 piksela i jest jednym z wyjątków od reguły „wszystko powinno być zanurzone”. Na wszystkich ekranach będzie miał 1 piksel. Ponadto 1px zwykle wygląda lepiej na ekranach HDpi i wyższych

Edycja "To już nie rok 2012": być może będziesz musiał przełączyć się na dp / dip, zaczynając od określonej gęstości ekranu

Joe Plante
źródło
4
Łał. Uratował mi życie. Powinien znajdować się w oficjalnym przewodniku Androida dotyczącym używania „dip”
deeJ
Zgadzam się. Powinni przynajmniej wspomnieć o tej regule dotyczącej px jako przykład, dlaczego ją mają.
Joe Plante
6
W przypadku ldpi 1dp = 0,75 piksela, dlatego zaokrągla się w dół do 0. Wówczas separator nie jest rysowany, co może powodować problemy dla innych. Odnosi się to również do innych stwierdzeń w tym wątku narzekających na używanie w ogóle px. To może, ale nie musi, być rozwiązaniem jego problemu i to od niego zależy, czy tak jest, czy nie
Joe Plante
18
1px będzie niewiarygodnie mały na urządzeniu xxhdpi, aw pewnym momencie (ponieważ urządzenia nadal będą miały większą gęstość) będzie za mały, aby go w ogóle zobaczyć. Dip pozwala tego uniknąć, a innym rozwiązaniem dla urządzeń ldpi jest użycie 1px w folderze values-ldpi i 1dip dla wyższych gęstości.
eski
2
Kiedy opublikowałem tę odpowiedź, myślę, że xxhdpi właśnie wychodziła. Jednak Twój post ma sens, zwłaszcza gdy na horyzoncie widać xxxhdpi i prawdopodobnie xxxxhdpi
Joe Plante,
55

To jest obejście, ale działa dla mnie:

Utworzono plik res / drawable / divider.xml w następujący sposób:

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

A w styles.xml dla elementu listview dodałem następujące wiersze:

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

Kluczową częścią było uwzględnienie tego ustawienia 1px. Oczywiście drawable używa gradientu (z 1px) i nie jest to optymalne rozwiązanie. Próbowałem użyć udaru, ale nie udało mi się. (Wygląda na to, że nie używasz stylów, więc po prostu dodaj atrybut android: dividerHeight = "1px" dla ListView.

Mika Vatanen
źródło
14
Lub użyj 1dp, aby uzyskać najlepsze praktyki.
Tristan Warner-Smith
2
Dlaczego używasz kąta 270? Separatory listy to poziome linie. 270 to pionowy gradient.
Christopher Perry,
Czy to nie jest błąd w Androidzie? Czy kształt linii nie powinien po prostu działać?
Diederik
8
Zasoby 1px są wyjątkiem od reguły
Joe Plante
1
@ TristanWarner-Smith to jest niepoprawne. w tym przypadku musisz użyć 1 piksela. zobacz zaakceptowaną odpowiedź.
mpellegr
27

Dodaj android:dividerHeight="1px"i zadziała:

<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
źródło
15

Problem, który masz, wynika z faktu, że brakuje Ci androida: dividerHeight, którego potrzebujesz, oraz faktu, że próbujesz określić grubość linii w swoim rysunku, czego nie możesz zrobić z separatorami dla niektórych dziwny powód. Aby przykład zadziałał, możesz zrobić coś takiego:

Utwórz swój do rysowania jako prostokąt lub linię, albo działa, po prostu nie możesz spróbować ustawić na nim żadnych wymiarów, więc albo:

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

LUB:

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

Następnie stwórz własny styl (tylko preferencje, ale lubię mieć możliwość ponownego użycia)

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

Na koniec zadeklaruj widok listy, używając stylu niestandardowego:

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

Zakładam, że wiesz, jak używać tych fragmentów, jeśli nie, daj mi znać. Zasadniczo odpowiedzią na twoje pytanie jest to, że nie możesz ustawić grubości dzielnika w rysowalnym, musisz zostawić tam niezdefiniowaną szerokość i zamiast tego użyć android: dividerHeight, aby ją ustawić.

Justin Buser
źródło
8

Z dokumentu:

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

Wygląda na to, że setDividerHeight()musi zostać wywołana, aby separator pojawił się, jeśli nie ma wewnętrznej wysokości

Plantage
źródło
5

Twój @drawable/list_dividepowinien wyglądać tak:

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

W swojej wersji podajesz an android:width="1dp", po prostu zmień go na android:height="1dp"i powinno działać!

chrześcijanin
źródło
5
android: wysokość nie jest prawidłowym atrybutem obrysu, a szerokość oznacza po prostu, jak szeroki jest obrys, a nie jak długi. Jedynym powodem, dla którego to „rozwiązanie” działa, jest to, że Android nie rozpoznaje tej wartości wysokości.
Justin
4

Z dokumentu :

Lokalizacja pliku:

res / drawable / filename.xml

Nazwa pliku jest używana jako identyfikator zasobu .

w zasadzie będziesz musiał umieścić plik o nazwie list_divider.xmlwres/drawable/ aby mieć do niego dostęp jako R.drawable.list_divider; jeśli możesz uzyskać do niego dostęp w ten sposób, możesz użyć android:divider="@drawable/list_divider"w XML dla ListView.

Lie Ryan
źródło
Pracuję z eclipse, więc gdybym tego nie zrobił, kod się nie skompilował. więc po umieszczeniu pliku nadal wydaje się, że widok listy ignoruje mój niestandardowy separator.
oriharel
2

Niektórzy ludzie mogą doświadczać ciągłej linii. android:layerType="software"Obejrzałem to, dodając do widoku odwołującego się do rysowalnego.

JeremyDay
źródło
1

Dokumentacja Androida ostrzega przed znikaniem rzeczy z powodu błędu zaokrąglenia ... Być może spróbuj użyć dp zamiast px, a być może najpierw spróbuj> 1, aby sprawdzić, czy jest to problem z zaokrągleniem.

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

dla sekcji „Obrazy o wysokości / szerokości 1 piksela”

dnunn0
źródło
Tak. Jeśli używasz 2 lub więcej dp / dip, wszystko jest w porządku. Jeśli jednak potrzebujesz tylko 1-pikselowego separatora, px jest drogą do zrobienia. Otrzymujesz także więcej miejsca na ekranie przy 1 pikselu, plus 1 piksel zwykle wygląda lepiej
Joe Plante
1

Miałem ten sam problem. Jednak widok 1px nie działał na moim oryginalnym Nexusie 7. Zauważyłem, że gęstość ekranu wynosiła 213, czyli mniej niż 240 w xhdpi. Więc myślał, że urządzenie ma gęstość mdpi.

Moim rozwiązaniem było sprawienie, by dimensfolder miał dividerHeightparametr. Ustawiłem to 2dpw values-mdpifolderze, ale 1dpw values-hdpifolderach itp.

RCB
źródło
1

zapomniałeś „r” na końcu separatora w układzie dzielnika xml

nazywasz layout @ drawable / list_divider, ale twój separator xml nazywa się "list_divide"

KC
źródło
-1

ustaw 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
źródło