GridView和ListView一样,都是项目中常用的控件之一,那么本篇文章要讲的是GridView如何适应不同大小的屏幕,首先,我们来看一张效果图,如下:

每行为四个item,上下左右间距大概2dp,而且会根据不同的屏幕大小,每个item中的图片随之缩放或放大以适应屏幕(始终保持正方形的样子),我们大多数在使用GridView的时候可能会把columnWidth设置了一个定值如70dp,然后numColumns为自动适配,这样虽然也可以,但是很影响用户体验,那么像上图这样的效果,应该怎么实现呢?

已经不屑于看这篇文章的大牛们请绕道啦,那么还不会实现这种效果的童鞋们此刻有什么思路呢?如何才能保证每行四个item,且自动适应屏幕大小?我们一步一步来分析:首先保证每行四个item不是很简单的事情嘛,把numColumns="4"不就可以了?然后呢,如何确定每个item的宽高呢?其实同样很简单,要想根据屏幕大小来决定item的宽高,不就得先知道屏幕的宽度吗?

WindowManager windowManager = getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        wh=display.getWidth();

得到的wh即为屏幕的宽度,不过要注意,这个得出的是像素px,然后再利用一个简单的数学计算算出每个item在屏幕中应占的宽度——已知每行四个item,每行的宽度是wh,每个item间相互距离是2,求每个item的宽度?

解:每个item的宽度=(wh-(5*2))/4;

即:行宽-各间距后再除以每行item的个数不就得出每个item应占的宽度了吗,然后高度和宽度相等即可。

但还有一个问题是,我们在xml中定义时,一般都用的dp而非px,这如何解决?那么我们把dp转换为px不就成了吗?

public static int Dp2Px(Context context, float dp) {
			    final float scale = context.getResources().getDisplayMetrics().density;
			    return (int) (dp * scale + 0.5f);
			}

此方法即dp转px,先看下xml中的GridView:

        <GridView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:fadingEdge="none"
            android:gravity="center_horizontal"
            android:horizontalSpacing="2dp"
            android:listSelector="@null"
            android:numColumns="4"
            android:scrollbars="none"
            android:stretchMode="columnWidth"
            android:verticalSpacing="2dp" >
        </GridView>

numColumns="4",verticalSpacing和horizontalSpacing都为2dp,那么我们在计算item的宽高时就要这样算:(wh -(5 * Dp2Px(context, 2)))/4;将2dp转为像素值即可,而GridView与屏幕两边的距离我们可以设置marginLeft="2dp",marginRight="2dp"即可。

然后我们在adapter中的getView方法中动态设置每个item的宽高(注意:item的布局文件不要设置固定宽高,全部fill_parent即可):

 AbsListView.LayoutParams param = new AbsListView.LayoutParams(宽度,高度);
		 convertView.setLayoutParams(param);

最后再return convertView即可。



demo可参考下篇文章:阻尼回弹效果的ScrollView嵌套GridView

GridView如何适配不同屏幕的更多相关文章

  1. Web App适配不同屏幕的几点建议

    安卓设备在屏幕尺寸和像素密度上差别很大,因此在使用WebView加载网页时就需要考虑到这种差别,对我们的网页做出精心的设计以在不同的屏幕上都能得到合适的展现.通常情况下,我们需要考虑到两个因素:1.视 ...

  2. CSS3自适配手机屏幕[转]

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  3. 如何指定一个和你的Android应用程序相适配的屏幕配置

    原文:http://android.eoe.cn/topic/android_sdk 描述: 指定每个与该应用程序兼容的屏幕配置.一个配置清单中只能有一个标签的实例,但是它能够包含多个元素.每个元素指 ...

  4. Android界面设计适配不同屏幕的尺寸和密度解读

    Android是运行在各种提供不同的屏幕尺寸和密度的设备.Android系统提供跨设备的统一开发环境和处理大部分的工作,以调整每个应用程序的用户界面,以在其上显示的画面. 同时,该系统提供了API,允 ...

  5. 【翻译】Best Practices for User interface android 适配不同屏幕、不同分辨率

    地址:http://developer.android.com/training/multiscreen/screendensities.html#TaskProvideAltBmp 安卓支持不同的屏 ...

  6. Android屏幕适配全攻略(最权威的官方适配指导)屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi

    Android屏幕适配全攻略(最权威的官方适配指导)原创赵凯强 发布于2015-05-19 11:34:17 阅读数 153734 收藏展开 转载请注明出处:http://blog.csdn.net/ ...

  7. CSS3自适配手机屏幕

    @media only screen and (max-width:350px){ .img{ width: 80px; height:70px; background-image: url(./im ...

  8. iOS:界面适配(三)--iPhone不同机型或设备不同尺寸适配(屏幕适配)和系统适配

    对于不同苹果设备,各个参数查看<iOS:机型参数.sdk.xcode各版本>.        机型变化 坐标:表示屏幕物理尺寸大小,坐标变大了,表示机器屏幕尺寸变大了: 像素:表示屏幕图片 ...

  9. Android适配(屏幕适配、国际化适配)-转

    首先来说一下Android的屏幕适配: 关于Android屏幕的一些基本概念知识,自行充电..在此只介绍实际开发过程中的使用 1.说到Android的屏幕适配,首当其冲的就是图片的适配 图片适配遵循两 ...

随机推荐

  1. LeetCode题目----求中位数---标签:Array

    题目难度---困难 题目要求: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 思路:第一眼 ...

  2. python打造一个Mysql数字类型注入脚本(1)

    前言: 总是想写一个sql注入脚本,但是之前的那些都不行. 这次做好了准备,然后嘿嘿嘿. 准备: sql注入的基础知识 熟悉怎么判断 正文: 思路概念图: 这里我没有限制用户输入,不限制的话可能会 @ ...

  3. 报错pymysql.err.DataError: (1406, "Data too long for column 'gender' at row 1")

    在Django默认的admin后台创建超级用户时, 报错pymysql.err.DataError: (1406, "Data too long for column 'gender' at ...

  4. [NOIp 2009]靶形数独

    Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他 ...

  5. ●UVA 11021 tunnello

    题链: https://vjudge.net/problem/UVA-11021题解: 概率DP. 定义dp[i]表示初始1只麻球的情况下,第i天都死完的概率. (因为每只麻球互相独立,那么最后答案为 ...

  6. bzoj4830 hnoi2017 抛硬币

    题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到 SSR,让他非常怀疑人生.勤勉的小 A ...

  7. [Codeforces]871D Paths

    失踪OJ回归. 毕竟这样的数论没做过几道,碰上一些具体的应用还是无所适从啊.小C还是借助这题大致摸索一下莫比乌斯函数吧. Description 有n个点,标号为1~n,为这n个点建一张无向图.两个点 ...

  8. 手机上的ROM与RAM

    ROM:read only memory翻译为只读存储器. RAM:read access memory翻译为随机存储器. 下面是一张手机的配置参数表. 简单来说,RAM就是真正意义上的内存,而ROM ...

  9. C指针 指针和数组 二维数组的指针 指针应用

    直接到变量名标识的存储单元中读取变量的值--直接寻址 通过其他变量间接找到变量的地址读取变量的值--间接寻址 指针变量存放地址 显示变量的地址 指针变量使用前必须初始化,若不知指向哪,可先指向NULL ...

  10. Angular5学习笔记 http请求

    在anular4更新到angular5后,有些模块也发生了有些变化,例如http模块. 首先在app.module.ts里面引入HttpClientModule import { HttpClient ...