版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
1.简介
GridView可以在二维滚动网格中显示项目的视图。可以通过实现AdapterView.OnItemClickListener和 AdapterView.OnItemLongClickListener接口来监听,常用xml属性如图一。
其中各种拉伸常量以及显示效果如下。
- 常量NO_STRETCH,静止拉伸,对应xml文件中的none。显示效果如图。
- 常量STRETCH_COLUMN_WIDTH,表示拉伸列,对应xml文件中的 columnWidth。显示效果如图。
- 常量STRETCH_SPACING,对应xml文件中的spacingWidth。表示若有剩余距离,则列宽不变,把剩余空间分配到列元素之间。显示效果如图。
- 常量STRETCH_SPACING_UNIFORM,对应xml中的spacingWidthUniform。表示若有剩余则往两边压。显示效果如图。
其他方法设置的显示效果。
- 不显示分割线的效果(设置水平间隔和垂直间隔为0)。
- 使用padding设置分割线的效果。
2.使用例子
新建GridViewDemoActivity,下面是效果图和代码。
- Utils.java。尺寸转换的工具类。
package xyz.strasae.androidlearn.myandroidapplication.util;
import android.content.Context;
import android.util.DisplayMetrics;
import android.view.WindowManager;
public class Utils {
// 根据手机的分辨率从 dp 的单位 转成为 px(像素)
public static int dip2px(Context context, float dpValue) {
// 获取当前手机的像素密度
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
// 根据手机的分辨率从 px(像素) 的单位 转成为 dp
public static int px2dip(Context context, float pxValue) {
// 获取当前手机的像素密度
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
// 获得屏幕的宽度
public static int getScreenWidth(Context ctx) {
// 从系统服务中获取窗口管理器
WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
// 从默认显示器中获取显示参数保存到dm对象中
wm.getDefaultDisplay().getMetrics(dm);
return dm.widthPixels; // 返回屏幕的宽度数值
}
// 获得屏幕的高度
public static int getScreenHeight(Context ctx) {
// 从系统服务中获取窗口管理器
WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
// 从默认显示器中获取显示参数保存到dm对象中
wm.getDefaultDisplay().getMetrics(dm);
return dm.heightPixels; // 返回屏幕的高度数值
}
// 获得屏幕的像素密度
public static float getScreenDensity(Context ctx) {
// 从系统服务中获取窗口管理器
WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
// 从默认显示器中获取显示参数保存到dm对象中
wm.getDefaultDisplay().getMetrics(dm);
return dm.density; // 返回屏幕的像素密度数值
}
}
- grid_item.xml。单元格的布局文件。
<?xml version="1.0" encoding="utf-8"?>
<!--网格布局的单元格布局文件-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFFFFF">
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#000000"
android:textSize="20sp"/>
<ImageView
android:id="@+id/iv_icon"
android:layout_width="match_parent"
android:layout_height="100dp"
android:scaleType="fitCenter"/>
<TextView
android:id="@+id/tv_description"
android:layout_width="match_parent"
android:layout_height="70dp"
android:gravity="center"
android:textColor="#000000"
android:textSize="13sp"/>
</LinearLayout>
- MyGridAdapter.java。GridView的适配器,同时实现了AdapterView.OnItemClickListener和 AdapterView.OnItemLongClickListener接口。
package xyz.strasae.androidlearn.myandroidapplication.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import xyz.strasae.androidlearn.myandroidapplication.R;
import xyz.strasae.androidlearn.myandroidapplication.bean.ItemDemo;
public class MyGridAdapter extends BaseAdapter implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener {
private Context context;
private ArrayList<ItemDemo> itemDemoArrayList;
//适配器的构造函数,传入设备上下文与要处理的数据队列
public MyGridAdapter(Context context, ArrayList<ItemDemo> itemDemoArrayList) {
this.context = context;
this.itemDemoArrayList = itemDemoArrayList;
}
@Override
public int getCount() {
return itemDemoArrayList.size();
}
@Override
public Object getItem(int i) {
return itemDemoArrayList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(context, "你选择的是" + itemDemoArrayList.get(i).name, Toast.LENGTH_SHORT).show();
}
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(context, "你长按了" + itemDemoArrayList.get(i).name, Toast.LENGTH_SHORT).show();
return true;
}
public final class ViewHolder {
private ImageView iv_icon;
private TextView tv_name;
private TextView tv_description;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView == null) {
viewHolder = new ViewHolder();
//根据布局文件生成转换视图对象
convertView = LayoutInflater.from(context).inflate(R.layout.grid_item, null);
viewHolder.iv_icon = convertView.findViewById(R.id.iv_icon);
viewHolder.tv_name = convertView.findViewById(R.id.tv_name);
viewHolder.tv_description = convertView.findViewById(R.id.tv_description);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
ItemDemo itemDemo = itemDemoArrayList.get(position);
viewHolder.iv_icon.setImageResource(itemDemo.image);
viewHolder.tv_name.setText(itemDemo.name);
viewHolder.tv_description.setText(itemDemo.description);
return convertView;
}
}
- item_dropdown.xml。Spinner的下拉列表项的布局文件。
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_drop_down"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:textColor="#000000">
</TextView>
- item_selected.xml。Spinner的列表项被选中时的布局文件。
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_selected"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:textColor="#9B7DAB"
android:background="#3B3A3A">
</TextView>
- activity_grid_view_demo.xml。GridViewDemoActivity的布局文件。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".GridViewDemoActivity"
android:orientation="vertical"
android:padding="10dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="40dp">
<TextView
android:id="@+id/tv_type"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:gravity="center"
android:text="分割线显示:"
android:textColor="#000000"
android:textSize="17sp"/>
<Spinner
android:id="@+id/sp_divider_type"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:spinnerMode="dialog"
android:gravity="left|center"
android:layout_toRightOf="@id/tv_type"/>
</RelativeLayout>
<GridView
android:id="@+id/gv_demo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ff0000"
android:horizontalSpacing="3dp"
android:verticalSpacing="3dp"
android:numColumns="2"
android:stretchMode="columnWidth"
/>
</LinearLayout>
- GridViewDemoActivity.java。
package xyz.strasae.androidlearn.myandroidapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.Spinner;
import java.util.ArrayList;
import xyz.strasae.androidlearn.myandroidapplication.adapter.MyGridAdapter;
import xyz.strasae.androidlearn.myandroidapplication.bean.ItemDemo;
import xyz.strasae.androidlearn.myandroidapplication.util.Utils;
public class GridViewDemoActivity extends AppCompatActivity {
private GridView gv_demo;
private Spinner sp_type;
private String[] dividerArray = {
"不显示分割线",
"只显示内部分割线(NO_STRETCH)",
"只显示内部分割线(COLUMN_WIDTH)",
"只显示内部分隔线(STRETCH_SPACING)",
"只显示内部分隔线(SPACING_UNIFORM)",
"显示全部分隔线(padding)"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grid_view_demo);
gv_demo = findViewById(R.id.gv_demo);
ArrayList<ItemDemo> itemDemos = ItemDemo.getDefaultList();
MyGridAdapter myGridAdapter = new MyGridAdapter(this, itemDemos);
gv_demo.setAdapter(myGridAdapter);
gv_demo.setOnItemClickListener(myGridAdapter);
gv_demo.setOnItemLongClickListener(myGridAdapter);
sp_type = findViewById(R.id.sp_divider_type);
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.item_selected, dividerArray);
adapter.setDropDownViewResource(R.layout.item_dropdown);
sp_type.setAdapter(adapter);
sp_type.setPrompt("Demo");
sp_type.setOnItemSelectedListener(new MyOnItemSelectedListener());
sp_type.setSelection(0);
}
private class MyOnItemSelectedListener implements AdapterView.OnItemSelectedListener {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
int dividerPadding = Utils.dip2px(GridViewDemoActivity.this, 5);
gv_demo.setBackgroundColor(Color.RED);
gv_demo.setHorizontalSpacing(dividerPadding);
gv_demo.setVerticalSpacing(dividerPadding);
gv_demo.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
gv_demo.setColumnWidth(250);
gv_demo.setPadding(0, 0, 0, 0);
if(i == 0) {
gv_demo.setBackgroundColor(Color.WHITE);
gv_demo.setHorizontalSpacing(0);
gv_demo.setVerticalSpacing(0);
}else if(i == 1) {
gv_demo.setStretchMode(GridView.NO_STRETCH);
}else if(i == 2) {
gv_demo.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
}else if(i == 3) {
gv_demo.setStretchMode(GridView.STRETCH_SPACING);
}else if(i == 4) {
gv_demo.setStretchMode(GridView.STRETCH_SPACING_UNIFORM);
}else if(i == 5) {
gv_demo.setPadding(dividerPadding, dividerPadding, dividerPadding, dividerPadding);
}
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
}
}