Android ListView Divider - PullRequest
       35

Android ListView Divider

95 голосов
/ 20 октября 2010

У меня есть этот код:

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

, где @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>

, но я не вижу делителя.

Ответы [ 12 ]

175 голосов
/ 21 августа 2012

Люди, вот почему вы должны использовать 1px вместо 1dp или 1dip: если вы укажете 1dp или 1dip, Android уменьшит это значение.На устройстве с разрешением 120 точек на дюйм это переводится примерно в 0,75 пикселя, что округляется до 0. На некоторых устройствах это переводится в 2-3 пикселя и обычно выглядит уродливо или неряшливоВысота, если вы хотите разделитель на 1 пиксель и является одним из исключений для правила «все должно быть погружено».Это будет 1 пиксель на всех экранах.Кроме того, 1px обычно выглядит лучше на экранах с разрешением hdpi и выше

Редактирование «Это уже не 2012»: возможно, вам придется переключиться на dp / dip, начиная с определенной плотности экрана

53 голосов
/ 07 ноября 2010

Это обходной путь, но у меня работает:

Создан файл res / drawable /divr.xml следующим образом:

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

И в styles.xml для элемента списка я добавил следующие строки:

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

Важнейшей частью было включение этого параметра в 1 пиксель. Конечно, drawable использует градиент (с 1px), и это не оптимальное решение. Я пытался использовать инсульт, но не получил его на работу. (Кажется, вы не используете стили, поэтому просто добавьте атрибут android: dividerHeight = "1px" для ListView.

26 голосов
/ 11 декабря 2011

Добавьте android:dividerHeight="1px" и это будет работать:

<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 голосов
/ 08 июля 2012

Проблема, с которой вы столкнулись, связана с тем, что вам не хватает андроида: dividerHeight, который вам нужен, и с тем фактом, что вы пытаетесь указать вес строки в вашей области рисования, что вы не можете сделать делители по какой-то странной причине. По сути, чтобы ваш пример работал, вы можете сделать что-то вроде следующего:

Создайте свой чертеж в виде прямоугольника или линии, либо все работает, вы просто не можете попытаться установить какие-либо размеры для него, либо:

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

OR

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

Затем создайте собственный стиль (просто предпочтение, но мне нравится иметь возможность многократно использовать материал)

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

Наконец, объявите ваш список, используя собственный стиль:

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

Я предполагаю, что вы знаете, как использовать эти фрагменты, если не сообщите мне. По сути, ответ на ваш вопрос заключается в том, что вы не можете установить толщину разделителя в чертеже, вы должны оставить ширину там неопределенной и использовать вместо нее android: dividerHeight.

8 голосов
/ 18 ноября 2011

Из документа:

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

Похоже, setDividerHeight() необходимо вызвать, чтобы разделитель обнаружился, если у него нет внутренней высоты

5 голосов
/ 16 апреля 2012

Ваш @drawable/list_divide должен выглядеть так:

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

В вашей версии вы предоставляете android:width="1dp", просто измените его на android:height="1dp", и оно должно работать!

4 голосов
/ 20 октября 2010

Из документа :

расположение файла:

res / drawable / filename.xml

Имя файла используется в качестве идентификатора ресурса .

в основном вам нужно поместить файл с именем list_divider.xml в res/drawable/, чтобы вы могли получить к нему доступ как R.drawable.list_divider; если вы можете получить к нему доступ таким образом, то вы можете использовать android:divider="@drawable/list_divider" в XML для ListView.

2 голосов
/ 26 февраля 2014

Некоторые люди могут испытывать сплошную линию.Я обошел это, добавив android:layerType="software" к представлению, ссылающемуся на drawable.

1 голос
/ 05 марта 2015

вы забыли "r" в конце разделителя в макете XML разделителя

вы называете layout @ drawable / list_divider, но ваш разделитель xml называется "list_divide"

1 голос
/ 14 мая 2014

У меня была такая же проблема. Однако создание 1px, похоже, не сработало на моем оригинальном Nexus 7. Я заметил, что плотность экрана была 213, что меньше, чем 240, используемых в xhdpi. Поэтому он думал, что устройство имеет плотность MDP.

Мое решение было сделать так, чтобы папка dimens имела параметр dividerHeight. Я установил значение 2dp в папке values-mdpi, но 1dp в папках values-hdpi и т. Д.

...