今天遇到一个需求,那就是GridView要以PopupWindow的方式展示数据,并且需要给gridview添加分割线。
我们知道GridView是没有想ListView那样的divider分割线的,所以我们需要自己画分割线。
一般来说我们是使用让背景色透出来形成分割线或者给每一项Item描边的方式产生分割线,当然,这在数据刚好填完整的时候是很好用的。
比如说,在这种情况下,看起来会很完美(我现在给的边是4dp,为了看起来更直观,现实中可能用不到这么大的边,为了更标准,我GridView本身再padding了4dp,所以现在的每条边有8dp,):
但是,在数据填不满的情况下,就会出现这样的问题。
或者我不要GridView的描边,那么现实是这样的。
会很明显的看出来,总会有一些边要比中间的边要细一半。总是达不到我要的效果。我需要图三那样的效果(没有Item的地方现实底部的视图),但是又想要每条边都一样粗细。
会出现中间的部分线条会比边沿的部分线条宽。那是因为中间的线条是上下两个item或者左右两个item的边拼起来的,也就是有8dp那么宽,那么我们怎么让它变成4dp呢?
现在说一下我的实现方式,灵感来源于http://stackoverflow.com/questions/7132030/android-gridview-draw-dividers
在里面的第一条回复中,我看到参数能够输入负数,也就是会隐藏一部分,下面来做一下实验。
第一步,同样的,我使每一项item四边都有一条深色的边显示出来。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#494b4e"
android:padding="4dp"
android:gravity="center_horizontal"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_job"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#696c71"
android:paddingBottom="@dimen/dim35"
android:gravity="center"
android:paddingTop="@dimen/dim35"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="@dimen/txt32" />
</LinearLayout>
第二部,我想办法把拼接的边从两倍宽变成一倍宽。有两个属性是很好用的,那就是android:horizontalSpacing(水平边距)和android:verticalSpacing(垂直边距);
既然这两个属性能设置0包括0以上的dp值,为什么我不能设置0一下的dp值呢。
我试了一下(使用8dp,是效果更明显),发现可行,并且很明显的可以看出来,下边的item会覆盖住上边的item的一部分,左右的item会覆盖左边的item的一部分。
<GridView
android:id="@+id/gv_second"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:horizontalSpacing="-8dp"
android:numColumns="3"
android:scrollbars="none"
android:verticalSpacing="-8dp" />
那么,我让他刚好覆盖掉上一个item的边和左右的item的边会是什么效果呢?发现结果是很漂亮的。
<GridView
android:id="@+id/gv_second"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:horizontalSpacing="-4dp"
android:numColumns="3"
android:scrollbars="none"
android:verticalSpacing="-4dp" />
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#494b4e"
android:padding="4dp"
android:gravity="center_horizontal"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_job"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#696c71"
android:paddingBottom="@dimen/dim35"
android:gravity="center"
android:paddingTop="@dimen/dim35"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="@dimen/txt32" />
</LinearLayout>