Android【GridView使用】

安卓GridView使用实例

GridView与ListView的用法基本一致,不同的只是布局。当我们打开手机,应用会以宫格显示,那就是GridView。 以代码形式展示,本次适配器使用BaseAdapter,熟悉了适配器的用法,就只需要注意几个GridView的属性即可。

1、GridView首先必须了解的地方😆

  1. GridView组件用来以网格方式排列视图,与矩阵类似,当屏幕上有很多元素(文字、图片或其他元素)需要显示时,可以使用该组件

  2. GridView是一个在二维可滚动的网格中展示内容的控件。网格中的内容通过使用adapter自动插入到布局中。

  3. 程序中,首先使用findViewById方法获取到了GridView控件,接下来使用setAdapter方法给它设置提供数据的适配器。

  4. 常用属性:

    • android:numColumns="auto_fit" ---------列数设置为自动
    • android:columnWidth="90dp",----------每列的宽度,也就是Item的宽度
    • android:stretchMode="columnWidth"------缩放与列宽大小同步
    • android:verticalSpacing="10dp"-----------垂直边距
    • android:horizontalSpacing="10dp"---------水平边距
  5. 基本步骤:

    1、准备数据源

    2、新建适配器

    3、加载适配器

写在前面:🍎

如果在程序中遇到字符乱码问题,请在build.gradle中android部分内加入以下代码

//参照物:buildToolsVersion "29.0.3"
Code>	android{compileOptions.encoding="GBK"}
//参照物defaultConfig {...}

2、分步解析

1、首先打开布局文件,添加GridView控件,推荐在RelativeLayout内进行

<GridView
        android:id="@+id/grid"
        android:layout_centerInParent="true"
        android:paddingVertical="150dp" //与上下边的间距
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingHorizontal="30dp"//与左右边的间距
        android:numColumns="2"/>

2、创建子布局,本实例仅使用文字

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    ********************
    android:padding="30dp">
// android:padding行高设置参数
    <TextView
        android:gravity="center"
        android:id="@+id/text"
        android:layout_centerInParent="true"
        android:layout_width="200dp"
        android:layout_height="100dp"/>
</RelativeLayout>

写在中间:🍊

假如发现inflater.inflate()方法找不到自己的子布局时,重启Andorid Studio就可以了

3、创建Adapter(本次使用BaseAdapter)

public class gridadapter extends BaseAdapter {
    private int[]  colors; //背景颜色
    private String[] titles; //文字内容
    private Context context;
    private LayoutInflater inflater;
    
    public gridadapter(int[] colors,String[] titles, Context context) {//适配器
        super();
        this.colors = colors;
        this.titles = titles;
        this.context = context;
        this.inflater = LayoutInflater.from(context);
    }
    
    @Override
    public int getCount() {
        return titles.length;
    }

    @Override
    public Object getItem(int position) {
        return titles[position];
    }

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

    @Override
    public View getView(int position, View v, ViewGroup parent) {
        v = inflater.inflate(R.layout.item, null);
        v.setBackgroundColor(colors[position]);
        TextView tv=  (TextView) v.findViewById(R.id.text);
        tv.setText(titles[position]);
        return v;
    }
}

4、MainActivity内容

public class MainActivity extends AppCompatActivity {
    private String[] string = { "足球场", "游泳馆", 
                               "羽毛球馆", "篮球场", 
                               "网球场","奥体用餐中心"};
    private int[] color = {
        	Color.parseColor("#C908B1EE"),
     		Color.parseColor("#C9168DFA"),
            Color.parseColor("#C985ABE2"),
       		Color.parseColor("#C907AB68"),
            Color.parseColor("#C9DF7808"),
        	Color.parseColor("#C9E45816")};
    private GridView gd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gd = findViewById(R.id.grid);
        gd.setAdapter(new gridadapter(color,string, this));
    }

}

5、点击事件参考:

gd.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        int po=position+1;
        switch (position){
            case 0:
                Toast.makeText(MainActivity.this, "Clicked "+po+" !",
                               Toast.LENGTH_SHORT).show();
                break;
            case 1:
                Toast.makeText(MainActivity.this, "Clicked "+po+" !", 
                               Toast.LENGTH_SHORT).show();
                break;
            case 2:
                Toast.makeText(MainActivity.this, "Clicked "+po+" !", 
                               Toast.LENGTH_SHORT).show();
                break;
            case 3:
                Toast.makeText(MainActivity.this, "Clicked "+po+" !",
                               Toast.LENGTH_SHORT).show();
                break;
            case 4:
                Toast.makeText(MainActivity.this, "Clicked "+po+" !",
                               Toast.LENGTH_SHORT).show();
                break;

        }
    }
});

3、附赠:

1、BaseAdapter,有几个必须实现的方法,如下所示:

方法介绍
getCount()getCount() 返回需要展示的GridView的项数。
getItem()getItem(int position) 返回给定位置的数据对象
getItemId()getItemId(int position) 返回该项的行id
getView()getView(int position, View convertView, ViewGroup parent) 必须要实现的方法,该方法控制GridView中数据项的显示,方法中的convertView视图是被复用的视图,在实现时对其进行判断,如果为null,则新建视图,否则直接复用视图。

2、布局文件中GridView的重要属性

布局属性相关方法介绍
android:columnWidthsetColumnWidth(int)定义每一列的固定宽度
android: gravityset Gravity(int)定义每一个单元格的重心
android:horizontalSpacingsetHorizontalSpacing(int)定义了两列之间的水平间隔
android:numColumnssetNumColumns(int)定义了展示的列数,int或auto_fit
android:stretchModesetStretchMode(int)定义了列拓展填充有限闲置空间的方式
android:verticalSpacingsetVerticalSpacing(int)定义两行之间的垂直间隔。属性设置要求同android:columnWidth
Gravity的参数:
常量描述
top0x30将对象放在它的容器的顶部,不会改变它的大小
bottom0x50将对象放在它的容器的底部,不会改变它的大小
left0x03将对象放在它的容器的左面,不会改变它的大小
right0x05将对象放在它的容器的右面,不会改变它的大小
center_vertical0x10将对象放在它的容器垂直方向的中心,不会改变它的大小
fill_vertical0x70如果需要改变对象的垂直大小以完全填充它的容器
center_horizontal0x01将对象放在它的容器水平方向的中心,不会改变它的大小
fill_horizontal0x07如果需要改变对象的水平大小以完全填充它的容器
center0x11将对象放在它的容器的中心,不会改变它的大小
fill0x77如果需要改变对象的水平和垂直方向的大小以完全填充它的容器
clip_vertical0x80附加选项被设置用来将子视图的上面或下面边缘裁剪到它的容器的边界。这个裁剪基于垂直方向的重心:top重心将会裁剪底部边缘,bottom重心将会裁剪顶部边缘,不会同时裁剪两边
clip_horizontal0x08附加选项被设置用来将子视图的左面或右面边缘裁剪到它的容器的边界。这个裁剪基于水平方向的重心:left重心将会裁剪右面边缘,right重心将会裁剪左面边缘,不会同时裁剪两边
start0x00800003将对象放在它的容器的起始位置,不会改变它的大小
end0x00800005将对象放在它的容器的末尾位置,不会改变它的大小

3、重要方法

  1. ListAdapter:getAdapter()
    返回关联的Adapter
  2. int:getColumnWidth()
    返回列的宽度
  3. int:getGravity()
    返回描述子视图被放置的方式的标识。默认为Gravity. LEFT。
  4. int:getHorizontalSpacing()
    返回列间的水平间隔大小。
    仅会计算当前布局。如果调用了setHorizontalSpacing(int)来设置间隔,但布局还没有完成,这个方法会返回一个旧值。如果想要明确地获取这个间隔,使用getRequestedHorizontalSpacing()方法请求。
  5. int:getNumColumns()
    返回列数。如果网格没有被布局,则返回AUTO_FIT。
  6. int:getRequestedColumnWidth()
    返回请求的列宽度。
    这可能不是真实的列宽度。使用getColumnWidth()获取当前真实的列宽度。
  7. int:getRequestedHorizontalSpacing()
    返回请求的列间的水平间隔。
    这个值可能是布局期间的局部样式,也可能是默认的样式,或是使用setHorizontalSpacing(int)方法设置的值。如果布局尚未完成或GridView计算得到了一个和请求的不同的水平间隔,它与
  8. getHorizontalSpacing()将有不同的返回值。
  9. int:getStretchMode()
    返回扩展模式。
  10. int:getVerticalSpacing()
    返回行间的垂直间隔。
  11. onInitializeAccessibilityNodeInfoForItem(View view, int position, AccessibilityNodeInfo info)
    使用列表中实际项的信息初始化一个AccessibilityNodeInfo。

4、具体示例

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:background="@mipmap/timg">

    <GridView
        android:layout_centerInParent="true"
        android:id="@+id/grid"
        android:paddingVertical="150dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingHorizontal="30dp"

        android:numColumns="2"/>
</RelativeLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="40dp">

    <TextView
        android:gravity="center"
        android:id="@+id/text"
        android:layout_centerInParent="true"
        android:layout_width="200dp"
        android:layout_height="100dp"/>
</RelativeLayout>

MainActivity.java

package com.example.a4_3_3;

import android.app.Activity;
import android.graphics.Color;
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 {
    private GridView gd;
    private String[] string = { "足球场", "游泳馆", "羽毛球馆", "篮球场", "网球场","奥体用餐中心" };
    private int[] color = {Color.parseColor("#C908B1EE"),Color.parseColor("#C9168DFA"),
                            Color.parseColor("#C985ABE2"),Color.parseColor("#C907AB68"),
                            Color.parseColor("#C9DF7808"),Color.parseColor("#C9E45816"),};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
        gd.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                int po=position+1;
                switch (position){
                    case 0:
                        Toast.makeText(MainActivity.this, "Clicked "+po+" !", Toast.LENGTH_SHORT).show();
                        break;
                    case 1:
                        Toast.makeText(MainActivity.this, "Clicked "+po+" !", Toast.LENGTH_SHORT).show();
                        break;
                    case 2:
                        Toast.makeText(MainActivity.this, "Clicked "+po+" !", Toast.LENGTH_SHORT).show();
                        break;
                    case 3:
                        Toast.makeText(MainActivity.this, "Clicked "+po+" !", Toast.LENGTH_SHORT).show();
                        break;
                    case 4:
                        Toast.makeText(MainActivity.this, "Clicked "+po+" !", Toast.LENGTH_SHORT).show();
                        break;

                }
            }
        });

    }
    private void initView() {
        // TODO Auto-generated method stub
        gd= (GridView) findViewById(R.id.grid);
    }
    private void initData() {
        // TODO Auto-generated method stub
        gd.setAdapter(new gridadapter(color,string, this));
    }
}

gridadapter.java

package com.example.a4_3_3;

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

public class gridadapter extends BaseAdapter {
    private int[]  colors;
    private String[] titles;
    private Context context;
    private LayoutInflater inflater;
    public gridadapter(int[] colors,String[] titles, Context context) {
        super();
        this.colors = colors;
        this.titles = titles;
        this.context = context;
        this.inflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return titles.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return titles[position];
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View v, ViewGroup parent) {
        v = inflater.inflate(R.layout.item, null);
        v.setBackgroundColor(colors[position]);
        TextView tv=  (TextView) v.findViewById(R.id.text);
        tv.setText(titles[position]);
        return v;
    }


}

写在最后🥇

了解更多:https://blog.csdn.net/Urchin_dong/article/details/50985079?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吃橘子的季节呢

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值