安卓GridView如何绘制分隔线

26

我想知道在GridView中为项目(目前是TextView)绘制分隔符的最简单方法。我能想到的唯一方法是在这些TextView周围绘制边框,以便在组合时它们看起来像连续的水平和垂直分隔符。

ListView有setDivider(),但GridView没有?

谢谢。


这个答案似乎比下面的答案更简单、更聪明。 - Sundeep
@Sundeep:如果您设置GridView项的背景颜色,则当其获得焦点时,该项的颜色不会改变。用户的选择可以解决这个问题。 - W.K.S
@Sundeep 这会减慢绘图过程。 - twlkyao
2个回答

35

如果您只想要简单的线条边框,更为简单的方法是为GridView设置背景颜色和适当的填充和间距:

<GridView
    (...)
    android:background="@color/LightGold"
    android:listSelector="@android:color/transparent"
    android:horizontalSpacing="1dip"
    android:verticalSpacing="1dip"
    android:paddingLeft="1dip"
    android:paddingTop="1dip" />

好主意,它会给你分隔符的效果,你可以通过增加水平和垂直间距来增加分隔符。 - Abdullah
2
这只有在您稍后单独设置每个单元格的背景时才能起作用。缺点是会造成过度绘制。 - Maragues
4
如果您有两列,且其中的项目数目为奇数,则可将实心背景添加到空白处。 - osrl

28

很遗憾,经过查看源代码,我没有发现除了为每个单元格添加边框之外,任何简单的方法来添加边框。作为参考,我在此发布我的解决方案。

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:background="@drawable/list_selector">

    <!-- Cell contents -->

</LinearLayout>

列表选择器.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:state_selected="true" 
        android:drawable="@drawable/item_border_selected" 
    />
    <item 
        android:state_pressed="true" 
        android:drawable="@drawable/item_border_selected" 
    />
    <item
        android:drawable="@drawable/item_border" 
    />
</selector>

item_border.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid 
        android:color="@android:color/transparent" 
    />
    <stroke 
        android:width="1px" 
        android:color="@color/list_divider" 
    />
</shape>

item_border_selected.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid 
        android:color="@color/list_select" 
    />
    <stroke 
        android:width="1px" 
        android:color="@color/list_divider" 
    />
</shape>

items_view.xml

<?xml version="1.0" encoding="utf-8"?>
<GridView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_marginLeft="-1px"
    android:layout_marginRight="-1px"
    android:listSelector="@android:color/transparent"
/>

因为所有的线条在连接相邻单元格时都会加倍,所以我将分隔线大小设置为1px而不是1dp,这样在某些屏幕上看起来不会太大。此外,我使网格视图具有负边距,以隐藏两侧的线条。希望这能对其他人有所帮助。


好的。你的 list_divider 和 list_select 是怎么定义的? - LuxuryMode
谢谢,我在list_selector.xml中使用了"@drawable/item_border"。它作为项目组件分割线运行良好,问题是如何避免在UI上点击分割线时触发onclick监听器?如果单击项目,则边框也会被选中:(!!有什么解决方法吗? - LOG_TAG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接