Android ListView Divider


98

У мене є цей код:

<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
Я не знаю чому, але код відсутній. ось воно знову:
oriharel

<ListView android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: id = "@ + id / cashItemsList" android: cacheColorHint = "# 00000000" android: delier = "@ dravable / list_divider"> </ListView>
oriharel

1
і роздільник списку: <shape xmlns: android = " schemas.android.com/apk/res/android " android: shape = "line"> <інсульт android: width = "1dp" android: color = "# 8F8F8F" android: dashWidth = "1dp" android: dashGap = "1dp" /> </shape>
oriharel

використовувати блок коду (піктограма 101010) для вставки кодів, особливо XML / HTML / SGML код. Я вже виправив вашу посаду.
Лі Лі Райан

Можливо, причина вашої проблеми у вашому ListAdapter. Просто спробуйте повернути істину адаптерів areAllItemsEnabled (). Або годинник stackoverflow.com/questions/5587826 / ...
grine4ka

Відповіді:


176

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

Для дільників 1px - це правильна висота, якщо ви хочете роздільник 1 пікселя і є одним з винятків для правила "все має бути зануреним". Це буде 1 піксель на всіх екранах. Крім того, 1px зазвичай виглядає краще на hdpi та вище екранах

"Це вже не 2012 рік" редагувати: можливо, вам доведеться перейти на dp / dip, починаючи з певної щільності екрана


4
Ого. Врятувало мені життя. Повинен бути частиною офіційного посібника Android щодо використання "dip"
deeJ

Я згоден. Вони, принаймні, повинні згадати це правило про px як приклад того, чому вони його мають.
Джо Плант

6
У ldpi 1dp = 0,75 пікселів, таким чином, округлюється до 0. Дільник тоді не виводиться, що може створювати проблеми для інших. Це також стосується інших тверджень у цій темі, які скаржаться на використання px взагалі. Це може бути, а може і не бути вирішенням його проблеми, і йому належить заявити, чи ні
Джо Плант

18
1px буде неймовірно малим на пристрої xxhdpi, і в якийсь момент (оскільки пристрої продовжують набирати більшу щільність) буде занадто малим, щоб його взагалі побачити. Dip уникає цього, а іншим рішенням для ldpi-пристроїв є використання 1px у папці значень-ldpi та 1dip для більшої щільності.
eski

2
Коли я опублікував цю відповідь, xxhdpi, я думаю, щойно вийшов. Однак ваша публікація має сенс, особливо з xxxhdpi та, можливо, xxxxhdpi на горизонті
Jo Plante

55

Це вирішення, але для мене працює:

Створено res / dravable / divideer.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. Звичайно, для малювання використовується градієнт (з 1 пікселем), і це не оптимальне рішення. Я спробував використовувати інсульт, але не змусив його працювати. (Ви, здається, не використовуєте стилі, тому просто додайте атрибут android: delierHeight = "1px" для ListView.


14
Або використовувати 1dp для кращої практики.
Трістан Уорнер-Сміт

2
Чому ви використовуєте кут 270? Розділювачі списків - горизонтальні лінії. 270 - вертикальний градієнт.
Крістофер Перрі

Це не помилка в Android? Чи не повинна просто працювати лінія лінії як роздільник?
Дідерік

8
Активістю 1px є виняток із правила
Джо Plante

1
@ TristanWarner-Smith це неправильно. у цьому випадку потрібно використовувати 1px. див. прийняту відповідь.
mpellegr

27

Додати, 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

Проблема, з якою у вас виникає, випливає з того, що вам не вистачає андроїд: divideerHeight, який вам потрібен, і того, що ви намагаєтеся вказати вагу лінії у вашому малюванні, що ви не можете зробити з дільниками для деяких дивна причина. По суті, щоб ваш приклад працював, ви можете зробити щось на кшталт наступного:

Створіть свій малюнок у вигляді прямокутника або лінії, або працює, ви просто не можете спробувати встановити на ньому жодних розмірів.

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

Я припускаю, що ви знаєте, як використовувати ці фрагменти, якщо не дайте мені знати. В основному, відповідь на ваше запитання полягає в тому, що ви не можете встановити товщину дільника в чертежному, вам потрібно залишити невизначеною ширину там і використовувати android: delierHeight, щоб встановити її замість.


8

Від док.

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

Ви @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"і він повинен працювати!


5
android: висота не є дійсним атрибутом для обведення, а ширина означає лише те, наскільки широкий хід, а не як довгий. Єдина причина, по якій працює ваше "рішення", полягає в тому, що Android не визнає цього значення висоти.
Джастін Бусер

4

Від док .

розташування файлу:

res / dravable / filename.xml

Ім'я файлу використовується як ідентифікатор ресурсу .

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


Я працюю з затемненням, так якби я цього не робив, код не збирався б. тож із наявним файлом все ще здається, що подання списку ігнорує мій спеціальний роздільник.
oriharel

2

Деякі люди можуть відчувати суцільну лінію. Я обійшов це, додавши android:layerType="software"до подання, що посилається на малюнок.


1

Документи андроїда попереджають про речі, що виникають через помилку округлення ... Можливо, спробуйте dp замість px, а можливо, також спершу спробуйте> 1, щоб побачити, чи це проблема округлення.

див. http://developer.android.com/guide/practices/screens_support.html#testing

для розділу "Зображення з висотою / шириною 1 пікселя"


Так. Якщо ви використовуєте 2 або більше dp / dip, тоді ви все в порядку. Однак, якщо ви просто хочете, щоб розділити 1 піксель, px - це шлях. Ви також отримуєте більше нерухомості на екрані з 1 пікселями, плюс 1 піксель зазвичай виглядає краще
Джо Плант

1

У мене було те саме питання. Однак, перегляд 1px, здається, не працює на моєму оригінальному Nexus 7. Я помітив, що щільність екрана становила 213, що менше 240, що використовується в xhdpi. Тож він думав, що пристрій має щільність mdpi.

Моє рішення полягало в тому, щоб зробити dimensпапку dividerHeightпараметром. Я встановив його 2dpу values-mdpiпапці, але 1dpу values-hdpiпапках тощо.


1

ви забули "r" в кінці дільника у вашому макеті XML-роздільника

ви називаєте макет @ dravable / list_divider, але ваш роздільник xml називається "list_divide"


-1

встановити android: delierHeight = "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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.