GridView网格视图

GridView是一种适配器视图,常用于网格布局展示信息。主要属性包括spacingWidth和spacingWidthUniform,分别处理列间距和边距。通过setAdapter、setOnItemClickListener和setOnItemLongClickListener设置适配器及事件监听。分割线可通过设置背景色和间距或自定义控件重绘实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网格视图GridView是一种常见的适配器视图,用于以网格的方式显示信息

  • 基本属性

GridView的属性及说明
xml文件中的属性GridView类的设置方法说明
horizontalSpacingsetHorizontalSpacing指定每个网格在水平方向上的间距
verticalSpacingsetVertcalSpacing指定每个网格在垂直方向上的间距
numColumnsetNumColumn设置GridView的列数,即一行有多少个网格
stretchModesetStretchMode设置剩余空间(网格以外的空间)的拉伸模式
columnWidthsetColumnWidth设置每列的宽度

stretchMode(拉伸模式)
xml文件中的拉伸模式GridView类中的拉伸模式说明
noneNO_STRETCH不拉伸
columnWidthSTRETCH_COLUMN_WIDTH拉伸列宽填补剩余空间
spacingWidthSTRETCH_SPACING列宽不变,拉伸每列的间距填补剩余空间
spacingWidthUniformSTRETCH_SPACING_UNIGORM列宽不变,拉伸每列左右的空隙填补剩余空间

其中spacingWidth和spacingWidthUniform很像,spacingWidth拉伸的是两列之间的距离,不填充左右边距,而spacingWidthUniform拉伸的是每列的左右间隙,即使该列的左边或者右边没有其它的列(左右边距)


  • 适配器

GridView与其他的适配器控件相差无几,实现了3个与适配器相关的方法

  1. setAdapter:设置数据适配器,一般继承自BaseAdapter
  2. setOnItemClickListener:设置网格项的点击事件监听器
  3. setOnItemLongClickListener:设置网格项的长按事件监听器

  • 分割线

GridView提供没有设置分割线的方法,但是我们可以通过其它方法来给GridView设置分割线


方法一:设置GridView的背景色以及网格之间的水平和垂直间距,再给网格项设置与GridView不同的背景色,让GridView的背景色变成分割线的效果。

这个方法不能设置网格视图边缘的分割线,要想显示出全部的分割线,需要为GridView设置padding属性。


方法二:自定义控件,重绘GridView画出分割线。

重绘GridView,绘制指定位置分割线示例代码

@Override
    protected void dispatchDraw(Canvas canvas) {
        super.dispatchDraw(canvas);
        //绘制边框
        int column = getNumColumns(); //获取列数
        int row = (int) Math.ceil(getChildCount() / (float) column); //获取行数
        int childCount = getChildCount();
        Paint linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        linePaint.setStyle(Paint.Style.STROKE);
        linePaint.setColor(Color.WHITE);
        for (int i = 0; i < childCount; i++) {
            View child = getChildAt(i);
            if ((i + 1) > column * (row - 1)) {
                //最后一行
                if ((i + 1) == column * row) {
                    continue;
                } else {
                    //最后一行且不是最后一个,画右边
                    canvas.drawLine(child.getRight(), child.getTop(), child.getRight()
                            , child.getBottom(), linePaint);
                }
            } else if ((i + 1) % column == 0) {
                //最右列,画底边
                canvas.drawLine(child.getLeft(), child.getBottom(), child.getRight()
                        , child.getBottom(), linePaint);
            } else {
                //画右边和底边
                canvas.drawLine(child.getLeft(), child.getBottom(), child.getRight()
                        , child.getBottom(), linePaint);
                canvas.drawLine(child.getRight(), child.getTop(), child.getRight()
                        , child.getBottom(), linePaint);
            }
            if ((i + 1) <= column) {
                //第一行,画顶边
                canvas.drawLine(child.getLeft(), child.getTop(), child.getRight()
                        , child.getTop(), linePaint);
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值