it-swarm-ru.tech

Интервал между элементами listView Android

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

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

Мой код ниже

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

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

358
Sammy

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

806
Nik Reiman

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

60
Asahi

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

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

Посмотреть список

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

Элемент списка

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

Вы должны обернуть свой элемент 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.

17
Vasu

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

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

11
kamelnyc

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

Посмотреть список:

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

@ Вытяжка/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>
8
LionKing

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

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

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

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

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

5
Tim Severeijns

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

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

OR

<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>
4
Rahul Raina

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

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

This SO ответ помог мне.

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

3
Sufian

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

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

</ListView>

просто set the divider to null и предоставление высоты делителю сделали для меня.

Пример:

Android:divider="@null"

или

Android:divider="@Android:color/transparent"

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

enter image description here

3
Sagar Pawar
<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>

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

Я установил clipToPadding в false, чтобы позволить рисовать представления в этой области.

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

2
Andrew Gallasch

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

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

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

2
FingerSmith

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

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

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

Просто добавляю:

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

в представлении нижнего макета, который вы надуете в классе адаптера, будет создан интервал между элементами

1
Juliagu

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

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

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

1
Avi Levin

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

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

1
jwehrle