安卓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,有几个必须实现的方法,如下所示:
|
|
|
|
|
|
|
|
|
|
2、布局文件中GridView的重要属性
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Gravity的参数:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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;
}
}