如何在Android中设置listView项目之间的空间

我试图在listView上使用marginBottom来使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>

在这种情况下,我如何使列表项之间的间距?

244303 次浏览

也许ListViewdividerdividerHeight属性可以解决你的问题。

@Asahi几乎一针见血,但我只是想为以后可能通过谷歌在这里浮动的任何人添加一点XML:

<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”)。

你应该将你的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项的左右添加空格。

我意识到答案已经被选择了,但我只是想分享当我遇到这个问题时,最终对我有用的方法。

我有一个listView,其中listView中的每个条目都由其自己的布局定义,类似于Sammy在他的问题中发布的内容。我尝试了建议的改变分隔线高度的方法,但最终看起来并不太漂亮,即使使用了一个隐形的分隔线。经过一些实验后,我简单地在XML文件中定义单个listView条目的最后一个TextView布局元素中添加了android:paddingBottom="5dip"

这最终给了我什么,我正试图通过使用android:layout_marginBottom实现。我发现这个解决方案产生了一个更美观的结果,而不是试图增加分隔高度。

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

如果你想显示一个带边距的分隔符,而不拉伸它-使用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"/>

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

我的解决方案是增加更多的空间,但保持水平线是在res/drawable文件夹中添加divider.xml,并在里面定义线的形状:

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

你可以使用:

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

OP的现有代码(列表项已经有填充)最简单的解决方案是添加以下代码:

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

SO回答帮助了我。

在旧的平台上,你可能会遇到列表项回收太快的错误,就像已经问过的在这里

你应该给出padding而不是margin:

<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:paddingBottom="(number)dp" &&android:paddingTop="(number)dp"在你的视图或视图中,你在你的列表视图中膨胀。

分割线只是一个解决方案,因为有一天,当你想使用分割线的颜色时(现在它是透明的),你会看到分割线被拉伸了。

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

并将paddingToppaddingBottomdividerHeight设置为相同的值,以获得所有元素之间的相等间距以及列表顶部和底部的空格。

我将clipToPadding设置为false,以让视图在这个填充区域中绘制。

我将divider设置为@null以删除列表元素之间的行。

另外,增加列表项之间间距的另一种方法是向适配器代码中添加一个空视图,方法是为layout_height属性提供所需的间距。例如,为了增加列表项之间的底部间距,将这个虚拟视图(空视图)添加到列表项的末尾。

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

这将在列表视图项之间提供15dp的底部间距。你可以直接添加这个,如果父布局是线性布局和方向是垂直的,或采取适当的步骤为其他布局。希望这对你有所帮助:-)

对于我的申请,我已经这样做了

 <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

我发现了一个不太好的解决方案,在这种情况下,你正在使用一个HorizontalListView,因为分隔器似乎不与它一起工作,但我认为它将工作为更常见的ListView。

添加:

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

在布局的最底部视图中,您在适配器类中膨胀将在项目之间创建间距

你只需要使背景透明的列表分割线和高度根据你需要的差距。

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

很多解决方案都是有效的。然而,如果你想要的是能够设置项目之间的空白,我想出的最简单的方法是包装你的项目-在你的情况下CheckedTextView -在一个线性布局,并把你的空白格式为项目,而不是根布局。一定要给这个包装布局一个id,并在适配器中创建CheckedTextView。

就是这样。实际上,您是在ListView的项级别上实例化页边距。因为ListView不知道任何项的布局——只有你的适配器知道。这基本上扩大了之前被忽略的项目布局部分。

这将帮助您添加分隔高度。

 getListView().setDividerHeight(10)

如果你想添加一个自定义视图,你可以在listView项目布局本身中添加一个小视图。

也许你可以尝试添加android:layout_marginTop = "15dp"and android:layout_marginBottom = "15dp"在最外层的布局