Як встановити простір між listView items в Android


371

Я намагався використовувати 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>

Як я можу в цьому випадку зробити відстань між елементами списку?

Відповіді:


829

@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").


24
Це не допоможе, якщо ви також хочете показати дільник, не розтягуючи його
Соджурн

4
FYI - це можна зробити за допомогою коду - getListView (). SetDividerHeight (10)
AnhSirk Dasarp

2
або android: delier = "@ null"
kevin

@Sojurn Я б спробував 9-патч, якщо мені потрібно щось подібне.
Суфіан

@Sojurn перевіри мою відповідь . Він додає прокладки, але не розтягує дільник.
Суфіан


43

Хоча рішення Ніка Реймана НЕ працює, я вважав, що це не оптимальне рішення для того, що я хотів зробити. Використовуючи роздільник для встановлення поля, виникла проблема, що дільник більше не буде видно, тому ви не можете використовувати його для показу чіткої межі між вашими елементами. Крім того, він не додає більше "області, що можна натискати" до кожного предмета, тому якщо ви хочете зробити свої елементи кліками, а ваші предмети тонкими, комусь буде дуже важко натиснути на предмет, оскільки висота, додана роздільником, не є частина предмета.

На щастя, я знайшов краще рішення, яке дозволяє показувати роздільники і дозволяє регулювати висоту кожного елемента, використовуючи не поля, а прокладки. Ось приклад:

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>

Справді, краще рішення. Дякую.
Bigyellowbee

17

Ви повинні обернути 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елемента.


3
Я хотів лівий / правий запас, тому ваша відповідь була для мене корисною, але мені не подобається ідея просто загортати інший макет лише для цілей поля
2cupsOfTech

Є кілька способів .. і це погано з точки зору продуктивності компонування .. спробуйте продумати списки з десятками (або сотнями) предметів :)
andrea.rinaldi

@ andrea.spot це не має значення для списків з десятками або сотнями предметів, якщо тільки не стільки предметів було видно на екрані одночасно. ListView використовує переробку перегляду (якщо ви правильно реалізували адаптер).
ataulm

1
Це не спрацює, якщо елементи ListView матимуть задній фон
vovahost

11

Моє рішення додати більше місця, але зберегти горизонтальну лінію було додати divider.xmlв res/drawableпапку та визначити форму лінії всередині:

роздільник.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/dravable-resource.html#stroke-element


8

Якщо ви хочете показати роздільник з полями і не розтягувати його - використовуйте InsetDravable (розмір повинен бути у форматі, про який сказав @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"/>

@ Dravable / 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

Ви можете використовувати:

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

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

6

Для моєї заяви я зробив це так

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

і це результат

введіть тут опис зображення


Я думаю, що краще android:divider="@android:color/transparent".
CoolMind

5

Я розумію, що відповідь вже була обрана, але я просто хотів поділитися тим, що закінчилося для мене, коли я стикався з цим питанням.

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

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


4

Замість того, щоб давати маржу, вам слід надати padding:

<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

Найпростіше рішення з існуючим кодом OP (елементи списку вже мають прокладку) - додати наступний код:

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

Ця відповідь ТА допомогла мені.

Примітка: Ви можете зіткнутися з помилкою елемента списку утилізацією занадто рано на старих платформах, як був запропоновано тут .


1
ви можете встановити нульовий роздільник і встановити поділку висоту на все, що завгодно.
Ендрю Галлаш

1
@Andy Я думаю, що це також видалить прокладки між елементами. Що буде створювати питання, яке хотіла вирішити ОП ..
Суфіан

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

Також ще одним способом збільшення інтервалу між елементами списку є те, що ви додаєте порожній вигляд у код свого адаптера, надаючи атрибут layout_height потрібному інтервалу. Наприклад, щоб збільшити відстань у нижній частині між елементами списку, додайте цей фіктивний вигляд (порожній вигляд) в кінець елементів списку.

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

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


2

вам просто потрібно зробити фон прозорим роздільником списку і зробити висоту відповідно до потрібного проміжку.

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

1

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

Просто додавання:

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

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


1

Для того, щоб виділити проміжки між переглядами всередині listView, будь ласка, використовуйте набивання ваших переглядів.

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

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


1

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

Це воно. Насправді ви створюєте копію запасу на рівні елемента для ListView. Оскільки ListView не знає про будь-яку компонування елементів - це робить лише ваш адаптер. Це в основному надуває частину макета елемента, яка була ігнорована раніше.


0

Це допоможе вам додати висоту дільника.

 getListView().setDividerHeight(10)

Якщо ви хочете додати спеціальний вигляд, ви можете додати невеликий перегляд у самому макеті спискуView.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.