Android ListView Divider

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

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

но я не вижу никакого разделителя.

Ответ 1

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

Для разделителей 1px - это правильная высота, если вы хотите делитель на 1 пиксель и является одним из исключений для правила "все должно быть окунуло". Это будет 1 пиксель на всех экранах. Кроме того, 1px обычно выглядит лучше на hdpi и выше экранах

"Это не 2012 больше" редактирование: вам может потребоваться переключиться на dp/dip, начиная с определенной плотности экрана

Ответ 2

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

Создан res/drawable/divider.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 для элемента listview я добавил следующие строки:

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

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

Ответ 3

Добавьте 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>

Ответ 4

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

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

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

ИЛИ

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

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

Ответ 5

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

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() должен вызываться для того, чтобы разделитель отображался, если он не имеет собственной высоты

Ответ 6

Ваш @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" и он должен работать!

Ответ 7

Из doc:

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

res/drawable/filename.xml

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

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

Ответ 8

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

Ответ 9

Андроидные документы предупреждают о исчезновении вещей из-за ошибки округления... Возможно, попробуйте dp вместо px и, возможно, сначала попробуйте > 1, чтобы увидеть, является ли это проблемой округления.

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

для раздела "Изображения с высотой и шириной 1 пикселя"

Ответ 10

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

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

Ответ 11

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

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

Ответ 12

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