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.
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.
Wherein the various constants and display the following drawing.
- Constant NO_STRETCH, static stretching, the xml file corresponding to none. Display as shown in FIG.
- Constant STRETCH_COLUMN_WIDTH, showing stretching column, the xml file corresponding to columnWidth. Display as shown in FIG.
- 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.
- Constant STRETCH_SPACING_UNIFORM, corresponding to the xml spacingWidthUniform. Indicates if the residual pressure to both sides. Display as shown in FIG.
Other methods of setting the display effect.
- Not display dividing lines (arranged horizontally spaced and vertically spaced to 0).
- Use padding effect dividing line is provided.
2. Use examples
New GridViewDemoActivity, renderings and the following is the code.
- 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; // 返回屏幕的像素密度数值
}
}
- 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>
- 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;
}
}
- 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>
- 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>
- 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>
- 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) {
}
}
}