Android GridView in use

Disclaimer: This article is a blogger original article, follow the CC 4.0 BY-SA copyright agreement, reproduced, please attach the original source link and this statement.
This link: https://blog.csdn.net/weixin_43219615/article/details/99603145

1 Introduction

GridView view of the project can be displayed in a scrolling two-dimensional grid. Can be achieved by AdapterView.OnItemClickListener monitor and AdapterView.OnItemLongClickListener interfaces, a common xml attribute FIG.
xml property
Wherein the various constants and display the following drawing.

  1. Constant NO_STRETCH, static stretching, the xml file corresponding to none. Display as shown in FIG.
    display effect
  2. Constant STRETCH_COLUMN_WIDTH, showing stretching column, the xml file corresponding to columnWidth. Display as shown in FIG.
    display effect
  3. Constant STRETCH_SPACING, xml file corresponding to the spacingWidth. Indicates if the remaining distance, the column width unchanged, the remaining space between the dispensing column elements. Display as shown in FIG.
    display effect
  4. Constant STRETCH_SPACING_UNIFORM, corresponding to the xml spacingWidthUniform. Indicates if the residual pressure to both sides. Display as shown in FIG.
    display effect

Other methods of setting the display effect.

  1. Not display dividing lines (arranged horizontally spaced and vertically spaced to 0).
    display effect
  2. Use padding effect dividing line is provided.
    display effect

2. Use examples

New GridViewDemoActivity, renderings and the following is the code.
Renderings

  1. Utils.java. Size conversion tools.
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. Cell layout file.
<?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 adapter while achieving AdapterView.OnItemClickListener and AdapterView.OnItemLongClickListener interface.
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 layout file drop-down list item.
<?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 list item layout file is selected.
<?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 layout file.
<?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) {

        }
    }
}

Guess you like

Origin blog.csdn.net/weixin_43219615/article/details/99603145