GridView 行和列之间的颜色设置,GridView 的 item 正方形显示

本文介绍如何通过设置背景色实现GridView中行列的颜色区分,并通过自定义布局使GridView的Item呈现正方形效果。

实现两个需求
- 通过 GridView 背景和其 item 背景实现行列之间的颜色
- 使 GridView 的 item 显示正方形效果

普通方式效果

普通效果

这个时候的代码如下:

GridView 代码

<GridView
        android:id="@+id/gv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:columnWidth="95dp"
        android:horizontalSpacing="2dp"
        android:verticalSpacing="2dp"
        android:numColumns="auto_fit" />

GridView item 代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/iv_item"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:scaleType="centerCrop"
        android:src="@drawable/ico_personal_settings" />

    <TextView
        android:id="@+id/tv_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:textSize="15sp"
        tools:text="标题" />
</LinearLayout>

如果这个时候我们想要实现 item 行列之间背景色,其实只需要再次基础上分别给 GridView 和 item设置不同的背景色即可,代码修改如下:

GridView 代码

<GridView
        android:id="@+id/gv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        android:columnWidth="95dp"
        android:horizontalSpacing="5dp"
        android:numColumns="auto_fit"
        android:verticalSpacing="5dp" />

多了设置背景色这句,别的无修改。再来看看其 item 布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorAccent"
    android:gravity="center"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/iv_item"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:scaleType="centerCrop"
        android:src="@drawable/ico_personal_settings" />

    <TextView
        android:id="@+id/tv_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:textSize="15sp"
        tools:text="标题" />
</LinearLayout>

同样只增加了背景颜色,别的无修改,现在来看看效果:

行列背景色

这样就实现了刚开始提出的第一个需求,接下来看看如何实现 GridView 的每个 item 显示为正方形。

GridView item显示正方形

如果我们通过设置 item 布局的宽高为正方形,其实是没有效果的,下面直接看实现方式。

  1. 自定义 item 布局

    public class SquareLayout extends RelativeLayout {
    
       public SquareLayout(Context context) {
           super(context);
       }
    
       public SquareLayout(Context context, AttributeSet attrs) {
           super(context, attrs);
       }
    
       @Override
       protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
           setMeasuredDimension(getDefaultSize(0, widthMeasureSpec),
                   getDefaultSize(0, heightMeasureSpec));
           widthMeasureSpec = heightMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth(),
                   MeasureSpec.EXACTLY);
           super.onMeasure(widthMeasureSpec, heightMeasureSpec);
       }
    }
  2. 修改 item 布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:tools="http://schemas.android.com/tools"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:background="@color/colorAccent"
       android:gravity="center"
       android:orientation="vertical">
    
       <com.cxs.yukumenu.SquareLayout
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:gravity="center">
    
           <ImageView
               android:id="@+id/iv_item"
               android:layout_width="35dp"
               android:layout_height="35dp"
               android:scaleType="centerCrop"
               android:src="@drawable/ico_personal_settings" />
    
           <TextView
               android:id="@+id/tv_item"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_below="@id/iv_item"
               android:layout_marginTop="8dp"
               android:textSize="15sp"
               tools:text="标题" />
       </com.cxs.yukumenu.SquareLayout>
    </LinearLayout>

    这里需要说明的是,如果你的 Item 最外层本来就是 RelativeLayout 的话,就可以直接将自定义的 RelativeLayout 作为跟布局使用。

现在就可以来看看效果了:

最终效果

就这样,两个需求都实现了。核心代码都贴出来了。


Android 技术分享平台,欢迎各位同行关注
code小生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code小生

有头像,我们容易成为朋友

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值