Интервал между элементами listView Android - PullRequest
360 голосов
/ 13 февраля 2011

Я попытался использовать marginBottom в listView, чтобы сделать пространство между элементом ListView, но все же элементы были присоединены вместе.

Возможно ли это вообще? Если да, есть ли конкретный способ сделать это?

Мой код ниже

<LinearLayout
android:id="@+id/alarm_occurences"
android:layout_width="fill_parent" 
android:orientation="vertical"
android:layout_height="fill_parent"
android:background="#EEEEFF"
xmlns:android="http://schemas.android.com/apk/res/android">

<ListView
android:id="@+id/occurences"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>

Мой пользовательский элемент списка:

<com.android.alarm.listItems.AlarmListItem
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" 
android:background="@drawable/alarm_item_background"
android:layout_marginBottom="10dp"    
>
<CheckedTextView     
    android:id="@android:id/text1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:checkMark="?android:attr/listChoiceIndicatorMultiple"
    android:textSize="20sp"
    android:textStyle="bold"
    android:typeface="serif"
    android:padding="10dp"

/>

</com.android.alarm.listItems.AlarmListItem>

Как сделать интервал между элементами списка в этом случае?

Ответы [ 17 ]

807 голосов
/ 15 марта 2011

@ Асахи в значительной степени ударил по голове, но я просто хотел добавить немного XML для любого, может быть, попозже сюда через google:

<ListView android:id="@+id/MyListView"
  android:layout_height="match_parent"
  android:layout_width="match_parent"
  android:divider="@android:color/transparent"
  android:dividerHeight="10.0sp"/>

По некоторым причинам, такие значения«10», «10.0» и «10sp» все отклоняются Android для значения dividerHeight.Он хочет число с плавающей запятой и единицу, такую ​​как "10.0sp".Как отмечает @Goofyahead, вы также можете использовать независимые от дисплея пиксели для этого значения (т. Е. «10dp»).

61 голосов
/ 13 февраля 2011

Возможно divider или dividerHeight свойство ListView может решить вашу проблему.

42 голосов
/ 30 мая 2013

Хотя решение Nik Reiman работает, я обнаружил, что оно не является оптимальным решением для того, что я хотел сделать. При использовании разделителя для установки полей возникла проблема, заключающаяся в том, что разделитель больше не будет виден, поэтому вы не можете использовать его, чтобы показать четкую границу между вашими элементами. Кроме того, он не добавляет больше «кликабельной области» к каждому элементу, поэтому, если вы хотите, чтобы ваши элементы были кликабельными, а ваши элементы тонкими, любому будет очень трудно нажать на элемент, поскольку высота, добавленная разделителем, часть предмета.

К счастью, я нашел лучшее решение, которое позволяет вам показывать разделители и регулировать высоту каждого элемента, используя не поля, а отступы. Вот пример:

ListView

<ListView
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>

ListItem

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="10dp"
    android:paddingTop="10dp" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:text="Item"
        android:textAppearance="?android:attr/textAppearanceSmall" />

</RelativeLayout>
17 голосов
/ 07 июня 2012

Вы должны обернуть свой элемент ListView (скажем, your_listview_item) в другой макет, например, LinearLayout и добавить поле к your_listview_item:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <your_listview_item
        android:id="@+id/list_item"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
    ...
    ...
    />
</LinearLayout>

Таким образом, при необходимости вы также можете добавить пробел справа и слева от элемента ListView.

11 голосов
/ 15 октября 2013

Мое решение добавить больше места, но сохранить горизонтальную линию, было добавить divider.xml в папку res/drawable и определить форму линии внутри:

divr.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line" >

    <stroke
        android:width="1px"
        android:color="@color/nice_blue" />

</shape>

затем в своем списке я ссылаюсь на свой делитель следующим образом:

<ListView
    android:id="@+id/listViewScheduledReminders"
    android:layout_width="match_parent"
    android:layout_height="0dip"
    android:layout_marginBottom="@dimen/mediumMargin"
    android:layout_weight="1"
    android:divider="@drawable/divider"
    android:dividerHeight="16.0dp"
    android:padding="@dimen/smallMargin" >

</ListView>

замечаю android:dividerHeight="16.0dp", увеличивая и уменьшая эту высоту. Я в основном добавляю больше отступов сверху и снизу от делителяline.

Я использовал эту страницу для справки: http://developer.android.com/guide/topics/resources/drawable-resource.html#stroke-element

8 голосов
/ 13 июля 2013

Если вы хотите показать разделитель с полями и без его растяжения - используйте InsetDrawable (размер должен быть в формате, о котором говорит @Nik Reiman):

ListView:

<ListView
    android:id="@+id/listView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:cacheColorHint="#00000000"
    android:divider="@drawable/separator_line"
    android:dividerHeight="10.0px"/>

@ drawable / separator_line:

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetLeft="5.0px"
    android:insetRight="5.0px"
    android:insetTop="8.0px"
    android:insetBottom="8.0px">

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <gradient
            android:startColor="@color/colorStart"
            android:centerColor="@color/colorCenter"
            android:endColor="@color/colorEnd"
            android:type="linear"
            android:angle="0">
        </gradient>
    </shape>
</inset>
7 голосов
/ 03 февраля 2014

Вы можете использовать:

android:divider="@null"
android:dividerHeight="3dp"

пример:

<ListView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listView" android:layout_gravity="center_horizontal"
        android:dividerHeight="3dp"
        android:divider="@null" android:clickable="false"/>
5 голосов
/ 08 сентября 2012

Я понимаю, что ответ уже был выбран, но я просто хотел поделиться тем, что сработало для меня, когда я столкнулся с этой проблемой.

У меня был listView, в котором была определена каждая запись в listView.своим собственным макетом, похожим на то, что Сэмми написал в своем вопросе.Я попробовал предложенный подход к изменению высоты разделителя, но это не выглядело слишком красиво, даже с невидимым разделителем.После некоторых экспериментов я просто добавил android:paddingBottom="5dip" к последнему элементу макета TextView в файле XML, который определяет отдельные записи listView.

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

4 голосов
/ 03 мая 2015

Вместо предоставления поля вы должны указать отступ:

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:divider="@android:color/green"
    android:dividerHeight="4dp"
    android:layout_alignParentTop="true"
    android:padding="5dp" >

</ListView>

ИЛИ

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:paddingTop="2dp"
    android:divider="@android:color/green"
    android:dividerHeight="4dp"
    android:paddingLeft="1dp"
    android:paddingRight="1dp"
    android:paddingBottom="2dp"
    android:paddingStart="0dp"
    android:paddingEnd="0dp" >

</ListView>
3 голосов
/ 07 января 2015

Самое простое решение с существующим кодом OP (элементы списка уже имеют заполнение) - добавить следующий код:

listView.setDivider(new ColorDrawable(Color.TRANSPARENT));  //hide the divider
listView.setClipToPadding(false);   // list items won't clip, so padding stays

Этот ТАК мне помог ответ.

Примечание: Возможно, вы слишком рано столкнетесь с ошибкой перезапуска элемента списка на старых платформах, как это было задано здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...