Android ListView分隔线


97

我有这个代码:

<ListView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:id="@+id/cashItemsList"
     android:cacheColorHint="#00000000"
     android:divider="@drawable/list_divider"></ListView>

在哪里@drawable/list_divider

<shape
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:shape="line">
 <stroke
   android:width="1dp"
   android:color="#8F8F8F"
   android:dashWidth="1dp"
   android:dashGap="1dp" />
</shape>

但我看不到任何分隔线。


1
我不知道为什么,但是代码丢失了。在这里又是:
oriharel

<ListView android:layout_width =“ wrap_content” android:layout_height =“ wrap_content” android:id =“ @ + id / cashItemsList” android:cacheColorHint =“#00000000” android:divider =“ @ drawable / list_divider”> </ ListView>
oriharel

1
并且列表分隔符为:<shape xmlns:android =“ schemas.android.com/apk/res/android ” android:shape =“ line”> <stroke android:width =“ 1dp” android:color =“#8F8F8F” android:dashWidth =“ 1dp” android:dashGap =“ 1dp” /> </ shape>
oriharel 2010年

使用代码块(101010图标)插入代码,尤其是XML / HTML / SGML代码。我已经修正了你的帖子。
Lie Ryan

也许您的问题的原因在您的ListAdapter中。只需尝试返回适配器的areAllItemsEnabled()的true。或观看stackoverflow.com/questions/5587826/...
grine4ka

Answers:


175

亲朋好友,这就是为什么您应该使用1px而不是1dp或1dip的原因:如果您指定1dp或1dip,则Android会将其缩小。在120dpi的设备上,转换后的像素变为0.75px,四舍五入为0。在某些设备上,转换为2-3像素,通常看起来很丑或草率。

对于分隔线,如果要使用1像素分隔线,则1px是正确的高度,并且是“一切都应浸入”规则的例外之一。在所有屏幕上均为1像素。另外,1px通常在hdpi及以上屏幕上看起来更好

“不再是2012年”编辑:您可能必须从某个屏幕密度开始切换到dp / dip


4
哇。救了我一命。应该成为使用“ dip”的Android官方指南的一部分
deeJ 2012年

我同意。他们至少应提及关于px的规则,以作为拥有该规则的示例。
乔·普兰特

6
在ldpi上,1dp = 0.75像素,因此向下舍入为0。然后分隔线不会被绘制,这可能会给其他像素带来麻烦。这也指该线程中的其他语句抱怨完全使用px。这可能是解决他问题的方法,也可能不是解决方案,这取决于他宣布是否解决
Joe Plante

18
在xxhdpi设备上1px会变得非常小,并且在某些时候(随着设备继续获得更高的密度)将太小而看不到。Dip避免了这种情况,对于ldpi设备,另一种解决方案是在values-ldpi文件夹中使用1px,对于更高密度使用1dip。
eski 2014年

2
当我发布该回复时,我认为xxhdpi刚刚发布。但是,您的帖子很有道理,尤其是xxxhdpi以及可能出现的xxxxhdpi
Joe Plante

54

这是一种解决方法,但对我有用:

如下创建res / drawable / divider.xml:

<?xml version="1.0" encoding="UTF-8"?>
<shape
  xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient android:startColor="#ffcdcdcd" android:endColor="#ffcdcdcd" android:angle="270.0" />
</shape>

在listview项目的styles.xml中,添加了以下几行:

    <item name="android:divider">@drawable/divider</item>
    <item name="android:dividerHeight">1px</item>

重要的是要包括此1px设置。当然,drawable使用渐变(1px),但这不是最佳解决方案。我尝试使用中风,但没有成功。(您似乎没有使用样式,因此只需为ListView添加android:dividerHeight =“ 1px”属性。


14
或使用1dp作为最佳做法。
Tristan Warner-Smith

2
为什么要使用270度角?列表分隔线是水平线。270是垂直渐变。
Christopher Perry

这不是Android中的错误吗?作为分隔线的线形不应该起作用吗?
Diederik

8
1px的资产是例外
乔·普兰特

1
@ TristanWarner-Smith,这是不正确的。在这种情况下,您需要使用1px。查看已接受的答案。
mpellegr,2014年

26

添加android:dividerHeight="1px",它将起作用:

<ListView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:id="@+id/cashItemsList"
     android:cacheColorHint="#00000000"
     android:divider="@drawable/list_divider" android:dividerHeight="1px"></ListView>

15

您遇到的问题源于您缺少所需的android:dividerHeight以及您试图在可绘制对象中指定线宽的事实,而某些分隔符无法做到这一点奇怪的原因。从本质上说,要使您的示例生效,您可以执行以下操作:

将您的可绘制对象创建为矩形或直线,要么可以正常工作,要么无法尝试在其上设置任何尺寸,因此:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line">
     <stroke android:color="#8F8F8F" android:dashWidth="1dp" android:dashGap="1dp" />
</shape>

要么:

<shape xmlns:android="http://schemas.android.com/apk/res/android"  android:shape="rectangle">
     <solid android:color="#8F8F8F"/>
</shape>

然后创建一个自定义样式(只是一个首选项,但我希望能够重用东西)

<style name="dividedListStyle" parent="@android:style/Widget.ListView">
    <item name="android:cacheColorHint">@android:color/transparent</item>
    <item name="android:divider">@drawable/list_divider</item>
    <item name="android:dividerHeight">1dp</item>
</style>

最后使用自定义样式声明您的列表视图:

<ListView
     style="@style/dividedListStyle"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:id="@+id/cashItemsList">
</ListView>

我假设您知道如何使用这些摘要,如果不告诉我的话。基本上,您的问题的答案是您无法在可绘制对象中设置分隔线的厚度,您必须在此处保留未定义的宽度,而是使用android:dividerHeight进行设置。


8

从文档中:

public void setDivider(Drawable divider) on ListView

/**
 * Sets the drawable that will be drawn between each item in the list. If the drawable does
 * not have an intrinsic height, you should also call {@link #setDividerHeight(int)}
 *
 * @param divider The drawable to use.
 */

setDividerHeight()如果没有固有高度,则看起来必须调用才能显示分隔线


5

@drawable/list_divide应该看起来像这样:

<shape
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:shape="line">
 <stroke
   android:height="1dp"
   android:color="#8F8F8F"
   android:dashWidth="1dp"
   android:dashGap="1dp" />
</shape>

在您的版本中,您提供了android:width="1dp",只需将其更改为即可使用android:height="1dp"


5
android:height不是笔划的有效属性,而width只是表示笔划的宽度,而不是笔划的长度。您的“解决方案”有效的唯一原因是Android无法识别该高度值。
贾斯汀·布什

4

文档

文件位置:

分辨率/可绘制/文件名.xml

文件名被用作资源ID

基本上,您需要放入一个名为的文件list_divider.xmlres/drawable/以便您可以通过R.drawable.list_divider; 来访问它。如果您可以通过这种方式访问​​它,则可以android:divider="@drawable/list_divider"在XML中使用ListView


我使用eclipse,所以如果我不这样做,代码将无法编译。因此,在放置了文件的情况下,列表视图仍然似乎忽略了我的自定义分隔符。
oriharel

2

有些人可能会遇到实线。我通过添加android:layerType="software"引用可绘制对象的视图来解决此问题。


1

android docs警告由于舍入错误而导致的事情消失了……也许尝试dp而不是px,也许还先尝试> 1以查看这是否是舍入问题。

看到 http://developer.android.com/guide/practices/screens_support.html#testing

对于“高度/宽度为1像素的图像”部分


是的 如果您使用的是2或更高的dp / dip,则可以。但是,如果只希望使用1像素分隔线,则px是可行的方法。您还可以获得1px的更多屏幕房地产,再加上1px通常看起来更好
Joe Plante

1

我遇到过同样的问题。但是,在我原来的Nexus 7上,将视图设为1px似乎不起作用。我注意到屏幕密度为213,小于xhdpi中使用的240。因此,它认为该设备的密度为mdpi。

我的解决方案是使dimens文件夹具有dividerHeight参数。我将其设置为 2dpvalues-mdpi文件夹中,但1dpvalues-hdpi等文件夹中。


1

您在分隔线xml布局的分隔线末尾忘记了“ r”

您将布局称为@ drawable / list_divider,但您的分隔符xml名为“ list_divide”


-1

设置android:dividerHeight =“ 1dp”

<ListView
            android:id="@+id/myphnview"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@drawable/dividerheight"
            android:background="#E9EAEC"
            android:clickable="true"
    android:divider="@color/white"
                android:dividerHeight="1dp"
                android:headerDividersEnabled="true" >
    </ListView>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.