安卓GridView使用实例
GridView与ListView的用法基本一致,不同的只是布局。当我们打开手机,应用会以宫格显示,那就是GridView。 以代码形式展示,本次适配器使用BaseAdapter,熟悉了适配器的用法,就只需要注意几个GridView的属性即可。
1、GridView首先必须了解的地方
😆
-
GridView组件用来以网格方式排列视图,与矩阵类似,当屏幕上有很多元素(文字、图片或其他元素)需要显示时,可以使用该组件
-
GridView是一个在二维可滚动的网格中展示内容的控件。网格中的内容通过使用adapter自动插入到布局中。
-
程序中,首先使用findViewById方法获取到了GridView控件,接下来使用setAdapter方法给它设置提供数据的适配器。
-
常用属性:
android:numColumns="auto_fit" ---------列数设置为自动
android:columnWidth="90dp",----------每列的宽度,也就是Item的宽度
android:stretchMode="columnWidth"------缩放与列宽大小同步
android:verticalSpacing="10dp"-----------垂直边距
android:horizontalSpacing="10dp"---------水平边距
-
基本步骤:
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:columnWidth | setColumnWidth(int) | 定义每一列的固定宽度 |
android: gravity | set Gravity(int) | 定义每一个单元格的重心 |
android:horizontalSpacing | setHorizontalSpacing(int) | 定义了两列之间的水平间隔 |
android:numColumns | setNumColumns(int) | 定义了展示的列数,int或auto_fit |
android:stretchMode | setStretchMode(int) | 定义了列拓展填充有限闲置空间的方式 |
android:verticalSpacing | setVerticalSpacing(int) | 定义两行之间的垂直间隔。属性设置要求同android:columnWidth |
Gravity的参数:
常量 | 值 | 描述 |
---|---|---|
top | 0x30 | 将对象放在它的容器的顶部,不会改变它的大小 |
bottom | 0x50 | 将对象放在它的容器的底部 ,不会改变它的大小 |
left | 0x03 | 将对象放在它的容器的左面,不会改变它的大小 |
right | 0x05 | 将对象放在它的容器的右面,不会改变它的大小 |
center_vertical | 0x10 | 将对象放在它的容器垂直方向的中心,不会改变它的大小 |
fill_vertical | 0x70 | 如果需要改变对象的垂直大小以完全填充它的容器 |
center_horizontal | 0x01 | 将对象放在它的容器水平方向的中心,不会改变它的大小 |
fill_horizontal | 0x07 | 如果需要改变对象的水平大小以完全填充它的容器 |
center | 0x11 | 将对象放在它的容器的中心,不会改变它的大小 |
fill | 0x77 | 如果需要改变对象的水平和垂直方向的大小以完全填充它的容器 |
clip_vertical | 0x80 | 附加选项被设置用来将子视图的上面或下面边缘裁剪到它的容器的边界。这个裁剪基于垂直方向的重心:top重心将会裁剪底部边缘,bottom重心将会裁剪顶部边缘,不会同时裁剪两边 |
clip_horizontal | 0x08 | 附加选项被设置用来将子视图的左面或右面边缘裁剪到它的容器的边界。这个裁剪基于水平方向的重心:left重心将会裁剪右面边缘,right重心将会裁剪左面边缘,不会同时裁剪两边 |
start | 0x00800003 | 将对象放在它的容器的起始位置,不会改变它的大小 |
end | 0x00800005 | 将对象放在它的容器的末尾位置,不会改变它的大小 |
3、重要方法
ListAdapter:getAdapter()
返回关联的Adapter
int:getColumnWidth()
返回列的宽度
int:getGravity()
返回描述子视图被放置的方式的标识。默认为Gravity. LEFT。
int:getHorizontalSpacing()
返回列间的水平间隔大小。
仅会计算当前布局。如果调用了setHorizontalSpacing(int)来设置间隔,但布局还没有完成,这个方法会返回一个旧值。如果想要明确地获取这个间隔,使用getRequestedHorizontalSpacing()方法请求。
int:getNumColumns()
返回列数。如果网格没有被布局,则返回AUTO_FIT。
int:getRequestedColumnWidth()
返回请求的列宽度。
这可能不是真实的列宽度。使用getColumnWidth()获取当前真实的列宽度。
int:getRequestedHorizontalSpacing()
返回请求的列间的水平间隔。
这个值可能是布局期间的局部样式,也可能是默认的样式,或是使用setHorizontalSpacing(int)方法设置的值。如果布局尚未完成或GridView计算得到了一个和请求的不同的水平间隔,它与
getHorizontalSpacing()将有不同的返回值。
int:getStretchMode()
返回扩展模式。
int:getVerticalSpacing()
返回行间的垂直间隔。
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