26. 【Android教程】网格视图 GridView_使用gridview实现网格视图展示的时候常规需要的步骤是?-程序员宅基地

技术标签: Android 入门教程  android  

和 ListView 一样,GridView 也是一个 ViewGroup,它用来将各种不同的控件整合到一起,按照一个二维可以滚动的网格视图展示出来。同时也遵循 MVC 模式,依靠 Adapter 自动帮我们完成 UI 和数据的绑定。

1. GridView 的特性

GridView 在 Android App 中运用非常广泛,比如我们手机的系统相册将我们的照片及照片名称按照网格的样式排列起来,并且可以上下滚动,这种效果非常适合用 GridView 实现。
为了实现 MVC 模式,更方便的管理数据与 UI,GridView 通过 Adapter 完成数据的填充,Adapter 的使用几乎和 ListView 一样,另外系统提供了几种简单的 Adapter,具体可以参考 23 节和 24 节的内容。

2. GridView 的基本用法

GridView 和 上一节所学的 ListView 极其相似,主要还是从属性、API 及事件监听器三个方面来介绍基本用法。

2.1 GridView 的常用属性

  • android:columnWidth:
    设置网格的列宽
  • android:gravity:
    网格内各个 item 的对齐方式
  • android:horizontalSpacing:
    网格的各个 item 在水平方向上的间距
  • android:verticalSpacing:
    网格的各个 item 在垂直方向上的间距
  • android:numColumns:
    设置列数,可以直接设置距离也可以设置成“auto_fit”让系统自适应
  • android:stretchMode:
    设置网格拉伸模式,可选值如下:
    • none: 不拉伸
    • spacingWidth: 将多余空间分摊给网格的间隔空隙
    • columnWidth: 将多余空间分摊给网格的各个列
    • spacingWidthUniform: 将多余空间分摊给网格的各个列及其间隔空隙

2.2 GridView 的常用 API

  • smoothScrollByOffset:
    平滑滚动一个相对距离
  • smoothScrollToPosition:
    平滑滚动到某个位置

2.3 GridView 的事件监听器

  • setOnItemClickListener:
    设置 GridView 的 item 点击事件回调,此接口与 ListView 完全一样。

3. GridView 的使用示例

为了和 ListView 以及 Adapter 两节的内容作对比,本节依旧实现“水果列表”的例子,只不过本节会把单维列表改成二维的网格样式,代码可基于上一节直接修改。

3.1 布局文件编写

首先修改布局文件,将 ListView 替换成 GridView 并添加一些 GridView 特有的属性,如下

3.2 GridView 适配器

以上属性都在 25.2.1 小节有描述,也比较好理解,接着修改 MyAdapter 类,它是继承自 BaseAdapter 实现的自定义适配器,因为二维列表更节省空间,上一节的水果数目已经没法占满一屏,这样会导致列表不能滑动,不利于体验 GridView 的效果。为此有两种解决方法:一个是我们可以手动扩展我们的列表数组,增加一些水果名称和图片;第二种方法是直接修改适配器,不断地循环从之前的列表中取水果数据。为了让大家更好的理解适配器的原理,我们采用第二种方法来扩展列表,我们需要修改两个回调方法:getCountgetView

  • getCount 表示列表的总 item 数,我们直接将水果列表长度乘以10:
     @Override
      public int getCount() {
          return mName.length * 10;
      }
    
  • getView 中我们完成 View 和数据的绑定,我们需要循环取数,所以只需要将 item 的位置对数组大小取模即可

完整的 MyAdapter 代码如下:

package com.emercy.myapplication;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;


public class MyAdapter extends BaseAdapter {

    private Context mContext;
    private String[] mName;
    private int[] mResId;

    public MyAdapter(Context context) {
        mContext = context;
    }

    public void setData(String[] name, int[] resId) {
        mName = name;
        mResId = resId;
    }


    @Override
    public int getCount() {
        return mName.length * 10;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = LayoutInflater.from(mContext).inflate(R.layout.list_view, null);
        TextView name = convertView.findViewById(R.id.textView);
        ImageView image = convertView.findViewById(R.id.imageView);
        name.setText(mName[position % mName.length]);
        image.setImageResource(mResId[position % mResId.length]);
        return convertView;
    }
}

3.3 主 Activity 逻辑

Activity 的逻辑其实和 ListView 中的例子完全一样,只需要将所有的 ListView 类型改成 GridView 即可。这里体现了 MVC 设计思路的灵活性,我们想要替换一个样式其实只需要修改布局文件,主逻辑和数据层完全不需要修改,这就是前面所说的 UI 和数据解耦的强大优势。MainActivity 代码如下:

package com.emercy.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;

public class MainActivity extends Activity {

    GridView mGridView;
    String[] mDataName = {"苹果", "梨", "香蕉", "桃子", "西瓜", "荔枝", "橘子"};
    int[] mDataImage = {R.drawable.apple, R.drawable.pear, R.drawable.banana, R.drawable.peach,
            R.drawable.watermelon, R.drawable.lychee, R.drawable.orange, R.drawable.orange};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mGridView = findViewById(R.id.gridview);

        MyAdapter adapter = new MyAdapter(this);
        adapter.setData(mDataName, mDataImage);
        mGridView.setAdapter(adapter);
        mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(getApplicationContext(), mDataName[i % mDataName.length], Toast.LENGTH_LONG).show();
            }
        });
    }
}

编译之后,可以发现从一维列表变成了网格列表,水果的样式循环 10 次,效果如下:

4. 小结

本节介绍了 Adapter 常用的第二个控件,它与 ListView 的用法及其相似,作为网格样式,相比 ListView 有一些二维的属性,其余的 API 和事件回调都和 ListView 完全一样。最后我们完成了和 ListView 类似的一个“水果”列表样式,通过修改 Adapter 可以达到扩展列表的效果。

这里也希望大家能够注意到 Adapter 的几个回调接口具体的含义,因为很多人虽然经常用 Adpater,但其实都是墨守成规的去实现那几个回调,没有真正的理解其内涵,这样在今后的实际开发中往往会遇到很多不可控的问题,希望大家能够做到知其然并知其所以然。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014316335/article/details/137830521

智能推荐

python编程画3d动图_python竟能绘制出如此炫酷的三维图-程序员宅基地

文章浏览阅读1.8k次。听说python语言在编程界排名又升了,其热度堪比此时七月天的气温,烫人。Python不仅在Web,数据分析和AI(人工智能)领域大展身手,而且在MAP方面,也是独领风骚。比如像下面这些炫图:Python分分钟钟搞定。先以曲线图为例:第一步:首先安装必需的包:Matplotlib,numpy例如:1、终端命令:pip install matplotlib2、当然IDE中也可以直接安装第二步:设置基..._python画三维图动态图

Gitlab Group Runner配置及相关问题记录_gitlab group runners-程序员宅基地

文章浏览阅读1.2k次,点赞32次,收藏27次。Gitlab Group Runner配置及相关问题记录_gitlab group runners

grep 多条件并行满足_使用grep -E进行多条件过滤-程序员宅基地

文章浏览阅读523次。project_A6078086216274=xxproject_A6078086227691=xxproject_A6078086224420=xxproject_A6078086233620=xxproject_A6078086240348=xxproject_A6078086358053=xxproject_A6078086366505=xxproject_A60..._grep -e

【100个 Unity实用技能】| Unity中常用的几种路径 分析,不同平台路径总结_unity 路径-程序员宅基地

文章浏览阅读7.8w次,点赞15次,收藏44次。在Unity中有很多种路径,尤其是在不同的平台上,同一种路径的写法可能最终是不一样的。本文就来总结一下Unity中的几种路径,以及简单的使用方法。_unity 路径

【深入理解Java虚拟机】【04】jdk命令行工具-程序员宅基地

文章浏览阅读154次。[TOC]jdk命令行工具0.概览名称作用jpsJVM Process Status Tool,显示系统中所有的Hotspot虚拟机进程jstatJVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据jinfoConfiguration info for java,显示..._com.sankuai.mms.boot.bootstrap

Android sdk 30 无法查看源码解决方案_android sdk33源码在platform-程序员宅基地

文章浏览阅读1.2k次。网上大多数是修改项目配置,我这里介绍一种伪装法,29到30变动不大,可以把29源码伪装成30源码。复制D:\program\androidsdk\sources 里面 29的文件夹,改名为30,然后修改D:\program\androidsdk\sources\android-30 里面package.xml、source.properties中 29的全改成30。然后重启 AndroidStudio..._android sdk33源码在platform

随便推点

细说独特的APaaS软件门类-程序员宅基地

文章浏览阅读868次。文/明道云创始人任向晖美国软件企业Intuit公司在2000年前后推出了一个产品,叫做Quickbase,顾名思义,就是快速开发数据库(应用)。它开了行业先河,不仅提供低代码的企业应用开发环境,而让应用直接在一个平台上运行,用户不再需要额外编译代码和配置运行环境。当然,在那个年代,APaaS这个品类名称还没有出现,一般都统称这类应用为ASP。在接下来的十多年中,这个品类不断发展,不仅做出了Smartsheet,Outsystems, ServiceNow这些独立上市公司,像Salesforce和微软也都_apaas软件门类

单链表实现栈结构_3.3 请设计一个栈,除了常规栈支持的 pop 与 push 函数以外,还支持 min 函数,该 函-程序员宅基地

文章浏览阅读749次,点赞4次,收藏4次。最近遇到一种类型的算法题,是实现栈的pop、push、peek等方法的同时,还让实现min取得栈中最小值的功能, 题目最特殊的一点就是,要求时间复杂度为O(1)。具体的题目如下:请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);_3.3 请设计一个栈,除了常规栈支持的 pop 与 push 函数以外,还支持 min 函数,该 函

计算机与CFD模拟仿真:技术的融合与应用_cfd怎么和算法融合-程序员宅基地

文章浏览阅读1.1k次,点赞30次,收藏19次。面对未来的挑战和发展趋势,我们期待计算机与CFD模拟仿真技术能够在更多的领域中发挥其强大的作用,推动科技的进步与发展。通过模拟风力发电机组在风场中的运行状态,我们可以优化风力发电机组的布局和设计,从而提高风力发电的效率和可靠性。未来的研究将更加注重于将人工智能技术应用于CFD模拟仿真中,以实现自动化建模、自动化求解和自动化后处理等功能,从而提高模拟仿真的效率和准确性。未来的研究将更加注重于开发多尺度模拟算法和技术,以实现不同尺度之间的平滑过渡和耦合,从而更好地模拟和理解流体的复杂行为。_cfd怎么和算法融合

java web整合海康威视录像机摄像SDK-程序员宅基地

文章浏览阅读3k次。java 项目demo目录结构java web整合海康威视录像机摄像SDK实现拍照功能。一、maven项目结构【提示】主要的是HCNetSDK.java文件,其中都是海康java调用dll文件获取摄像头资源的接口。(1)库文件配置如果是linux环境将库文件放在/usr/li..._java调用海康威视,实现hls实时预览和回放

python中print是什么意思中文-python中使用print输出中文的方法-程序员宅基地

文章浏览阅读1.9k次。看Python简明教程,学习使用print打印字符串,试了下打印中文,不行。编辑环境:IDLE上网搜了下解决办法,各种说法,试了两种:print u"学习"print (unicode("学习", encoding="utf-8"))保存时均还是会提示shell输出:?§?°??说明第二种还是有编码但还是不对。最后,加上最前面一行就好了,..._print从网站上获取的值是英文

Nested Logit模型拟合实战案例(SAS篇)-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏3次。在《Nested Logit模型》一文中,我们给出了Nested Logit模型的基本结构。有了理论,下一步便是实操。本篇我们介绍如何利用SAS去拟合Nested Logit模型(所用的软件为SAS 9.4版本)。全文共约6500字,24张配图,详细介绍利用SAS创建Nested Logit模型的流程,以及模型背后的行为假设(Behavior Assumption)。可以非常自信的说,本文是截止目前介绍SAS拟合Nested Logit模型最详细的中文资料。本文可以让您了解到以下几个方面的内_nested logit模型