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.


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


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.


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>

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


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


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


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.


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.


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”


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.


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"


-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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.