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

最新文章

  1. ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务解决
  2. Linux中强制结束一个进程的终极方法
  3. php防sql注入
  4. 彻底弄懂css中单位px和em,rem的区别 转的自己看
  5. a different object with the same identifier value was already associat
  6. 【Qt】使用QProcess调用其它程序或脚本
  7. Java API —— 异常
  8. csv内存流文件流
  9. BZOJ 1497: [NOI2006]最大获利( 最大流 )
  10. PAT乙级-1063. 计算谱半径(20)
  11. Leetcode_5.最长回文子串
  12. vuejs2.0使用Sortable.js实现的拖拽功能
  13. Oracle 周相关函数
  14. 全局最小割Stoer-Wagner算法
  15. android 短信拦截
  16. hihocoder 1341 Constraint Checker【string】
  17. 8. 博客系统| 富文本编辑框和基于bs4模块防御xss攻击
  18. Django 事物
  19. centos7-使用nginx做ftp站
  20. ImageLoader初始化以及调用

热门文章

  1. [HNOI 2011]XOR和路径
  2. 【LA3938】&quot;Ray, Pass me the dishes!&quot;
  3. bzoj4152[AMPPZ2014]The Captain 最短路
  4. Linux 脚本为什么会有#!
  5. Python中模块之re的功能介绍
  6. MySQL数据库将多条记录的单个字段合并成一条记录
  7. Mysql锁机制--并发事务带来的更新丢失问题
  8. JNI 方法注册与签名+BufferedReader使用readLine问题
  9. C++框架_之Qt的窗口部件系统的详解-上
  10. ACM Doing Homework again