【问题标题】:Android ListView DividerAndroid ListView 分隔符
【发布时间】:2011-04-28 02:40:20
【问题描述】:

我有这个代码:

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

但我看不到任何分隔线。

【问题讨论】:

  • 我不知道为什么,但是代码丢失了。又来了:
  • 列表分隔符是: schemas.android.com/apk/res/android" android:shape="line">
  • 使用代码块(101010 图标)插入代码,尤其是 XML/HTML/SGML 代码。我已经修复了你的帖子。
  • 可能问题的原因在于您的 ListAdapter。只需尝试将适配器的 areAllItemsEnabled() 返回 true。或观看stackoverflow.com/questions/5587826/…

标签: android listview divider


【解决方案1】:

伙计们,这就是为什么您应该使用 1px 而不是 1dp 或 1dip:如果您指定 1dp 或 1dip,Android 会按比例缩小。在 120dpi 的设备上,它变成了 0.75px 的平移量,四舍五入为 0。在某些设备上,它转换为 2-3 像素,通常看起来很难看或草率

对于分隔线,如果您想要一个 1 像素的分隔线,则 1px 是正确的高度,并且是“一切都应该倾斜”规则的例外情况之一。在所有屏幕上都是 1 个像素。另外,1px 通常在 hdpi 及以上的屏幕上看起来更好

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

【讨论】:

  • 哇。救了我的命。应该是 Android 官方使用“dip”指南的一部分
  • 我同意。他们至少应该提到关于 px 的规则作为他们为什么拥有它的一个例子。
  • 在 ldpi 上,1dp = 0.75 像素,因此向下舍入为 0。然后不会绘制分隔线,这可能会给其他人带来问题。这也指的是该线程中抱怨完全使用 px 的其他陈述。这可能是也可能不是他的问题的解决方案,由他决定是否是
  • 1px 在 xxhdpi 设备上将非常小,并且在某些时候(随着设备继续获得更高的密度)将太小而无法看到。 Dip 避免了这种情况,ldpi 设备的另一个解决方案是在 values-ldpi 文件夹中使用 1px,而 1dip 用于更高的密度。
  • 当我发布该回复时,我认为 xxhdpi 刚刚出来。但是,您的帖子是有道理的,尤其是 xxxhdpi 和可能出现的 xxxhdpi
【解决方案2】:

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

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

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

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

关键部分是包含这个 1px 设置。当然,drawable 使用渐变(1px),这不是最佳解决方案。我尝试使用中风,但没有让它发挥作用。 (您似乎没有使用样式,因此只需为 ListView 添加 android:dividerHeight="1px" 属性即可。

【讨论】:

  • 或使用 1dp 进行最佳实践。
  • 你为什么用270的角度?列表分隔线是水平线。 270 是垂直渐变。
  • 这不是安卓的bug吗?线形不应该作为分隔线起作用吗?
  • 1px 资产是规则的例外
  • @TristanWarner-Smith 这是不正确的。在这种情况下,您需要使用 1px。查看接受的答案。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    您遇到的问题源于您缺少所需的 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>
    

    我假设您知道如何使用这些 sn-ps,如果不告诉我。基本上你的问题的答案是你不能在drawable中设置分隔线的厚度,你必须在那里留下未定义的宽度并使用 android:dividerHeight 来设置它。

    【讨论】:

      【解决方案5】:

      来自文档:

      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() 才能显示分隔符(如果它没有固有高度)

      【讨论】:

        【解决方案6】:

        您的@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",它应该可以工作!

        【讨论】:

        • android:height 不是笔划的有效属性,宽度仅表示笔划的宽度,而不是长度。您的“解决方案”有效的唯一原因是 Android 无法识别该高度值。
        【解决方案7】:

        来自doc

        文件位置:

        res/drawable/filename.xml

        文件名用作资源 ID

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

        【讨论】:

        • 我使用 Eclipse,所以如果我没有这样做,代码将无法编译。所以,有了文件,列表视图似乎仍然忽略了我的自定义分隔符。
        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

          android 文档警告事情会因舍入错误而消失...也许尝试 dp 而不是 px,也许还可以先尝试 > 1 以查看是否是舍入问题。

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

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

          【讨论】:

          • 是的。如果您使用 2 个或更多 dp/dip,那么您就可以了。但是,如果您只想要那个 1 像素的分隔线,那么 px 是可行的方法。您还可以使用 1px 获得更多屏幕空间,再加上 1px 通常看起来更好
          【解决方案10】:

          我遇到了同样的问题。然而,使视图 1px 似乎不适用于我原来的 Nexus 7。 我注意到屏幕密度为 213,小于 xhdpi 中使用的 240。所以它认为该设备是 mdpi 密度。

          我的解决方案是让dimens 文件夹有一个dividerHeight 参数。我在values-mdpi 文件夹中将其设置为2dp,但在values-hdpi 等文件夹中将其设置为1dp

          【讨论】:

            【解决方案11】:

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

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

            【讨论】:

              【解决方案12】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-01-08
                • 1970-01-01
                • 2011-09-07
                • 2013-06-28
                • 1970-01-01
                • 2014-06-20
                相关资源
                最近更新 更多