Расстояние между элементами listView Android

Я попытался использовать 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 ответов


@Asahi в значительной степени попал в гвоздь на голове, но я просто хотел добавить немного 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.0 sp". Как отмечает @Goofyahead, вы также можете использовать независимые от дисплея пиксели для этого значения (т. е. "10dp").


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


хотя решение Ника Реймана действительно работает, я нашел, что это не оптимальное решение для того, что я хотел сделать. Использование разделителя для установки полей было проблемой, что разделитель больше не будет виден, поэтому вы не можете использовать его, чтобы показать четкую границу между вашими элементами. Кроме того, он не добавляет больше "кликабельной области" к каждому элементу, таким образом, если вы хотите сделать ваши элементы кликабельными и ваши элементы тонкие, это будет очень трудно для кого-либо нажать на элемент, как высота, добавленная перегородка не является частью элемента.

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

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>

вы должны обернуть ваш ListView пункт (скажем your_listview_item) в некотором другом макете e.g 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 товар.


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

делитель.в 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" увеличивая и уменьшая эту высоту, я в основном добавляю больше заполнения сверху и снизу линии делителя.

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


Если вы хотите показать делитель с полями и не растягивая его-используйте 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>

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

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

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

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

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


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

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

этой так что ответ мне помог.

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


для моего приложения я сделал это

 <ListView
    android:id="@+id/staff_jobassigned_listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@null"
    android:dividerHeight="10dp">

</ListView>

и это результат

enter image description here

просто android: divider= "@null"и предоставление высоты делителю для меня.


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

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

<ListView
    android:clipToPadding="false"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"
    android:dividerHeight="10dp"
    android:divider="@null"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</ListView>

и set paddingTop, paddingBottom и dividerHeight к тому же значению, чтобы получить равное расстояние между всеми элементами и пробелом в верхней и нижней части списка.

Я clipToPadding до false чтобы виды были нарисованы в этой мягкой области.

Я divider to @null чтобы удалить строки между элементами списка.


также еще один способ увеличить расстояние между элементами списка-добавить пустое представление в код адаптера, предоставив атрибут layout_height с требуемым расстоянием. Например, чтобы увеличить нижний интервал между элементами списка, добавьте этот фиктивный вид (пустой вид) в конец элементов списка.

<View
    android:layout_width="match_parent"
    android:layout_height="15dp"/>

Так это обеспечит Нижний интервал 15 дп между списком предметов. Вы можете напрямую добавить это, если родительский макет LinearLayout и ориентация вертикальная или предпринять соответствующие шаги для другого макета. Надеюсь, это поможет : -)


вам как раз нужно сделать предпосылку прозрачным рассекателя списка и сделать высоту согласно вашему необходимому зазору.

<ListView 
         android:id="@+id/custom_list"
         android:layout_height="match_parent"
         android:layout_width="match_parent"
         android:divider="#00ffffff"
         android:dividerHeight="20dp"/>

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

просто добавив:

<View
android:layout_marginBottom="xx dp/sp"/>

в bottomest вид макета вы раздуваете в класс адаптера позволит создать интервал между элементами


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

можно использовать android:paddingBottom="(number)dp" &&android:paddingTop="(number)dp" на вашем представлении или представлениях вы раздуваете внутри своего listview.

решение делителя - это просто исправление, потому что когда-нибудь, когда вы захотите использовать цвет делителя (прямо сейчас он прозрачный), вы увидите, что линия делителя растянута.


многие из этих решений. Однако, если все, что вы хотите, это иметь возможность установить маржу между элементами, самый простой метод, который я придумал, - это обернуть ваш элемент - в вашем случае CheckedTextView-в LinearLayout и поместить форматирование маржи для элемента в это, а не корневой макет. Обязательно дайте этому макету упаковки идентификатор и создайте его вместе с вашим CheckedTextView в вашем адаптере.