Android中GridView的使用

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

1.简介

GridView可以在二维滚动网格中显示项目的视图。可以通过实现AdapterView.OnItemClickListener和 AdapterView.OnItemLongClickListener接口来监听,常用xml属性如图一。
xml属性
其中各种拉伸常量以及显示效果如下。

  1. 常量NO_STRETCH,静止拉伸,对应xml文件中的none。显示效果如图。
    显示效果
  2. 常量STRETCH_COLUMN_WIDTH,表示拉伸列,对应xml文件中的 columnWidth。显示效果如图。
    显示效果
  3. 常量STRETCH_SPACING,对应xml文件中的spacingWidth。表示若有剩余距离,则列宽不变,把剩余空间分配到列元素之间。显示效果如图。
    显示效果
  4. 常量STRETCH_SPACING_UNIFORM,对应xml中的spacingWidthUniform。表示若有剩余则往两边压。显示效果如图。
    显示效果

其他方法设置的显示效果。

  1. 不显示分割线的效果(设置水平间隔和垂直间隔为0)。
    显示效果
  2. 使用padding设置分割线的效果。
    显示效果

2.使用例子

新建GridViewDemoActivity,下面是效果图和代码。
效果图

  1. 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; // 返回屏幕的像素密度数值
    }
}
  1. 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>
  1. 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;
    }
}
  1. 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>
  1. 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>
  1. 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>
  1. 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) {

        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43219615/article/details/99603145