GridView如何适配不同屏幕

来源:互联网 发布:ios编程软件 编辑:程序博客网 时间:2024/05/21 15:00

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


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

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

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. WindowManager windowManager = getWindowManager();      
  2.         Display display = windowManager.getDefaultDisplay();      
  3.         wh=display.getWidth();  
得到的wh即为屏幕的宽度,不过要注意,这个得出的是像素px,然后再利用一个简单的数学计算算出每个item在屏幕中应占的宽度——已知每行四个item,每行的宽度是wh,每个item间相互距离是2,求每个item的宽度?

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

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

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

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public static int Dp2Px(Context context, float dp) {   
  2.                 final float scale = context.getResources().getDisplayMetrics().density;   
  3.                 return (int) (dp * scale + 0.5f);   
  4.             }  
此方法即dp转px,先看下xml中的GridView:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <GridView  
  2.     android:layout_width="fill_parent"  
  3.     android:layout_height="wrap_content"  
  4.     android:fadingEdge="none"  
  5.     android:gravity="center_horizontal"  
  6.     android:horizontalSpacing="2dp"  
  7.     android:listSelector="@null"  
  8.     android:numColumns="4"  
  9.     android:scrollbars="none"  
  10.     android:stretchMode="columnWidth"  
  11.     android:verticalSpacing="2dp" >  
  12. </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即可):

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. AbsListView.LayoutParams param = new AbsListView.LayoutParams(宽度,高度);  
  2.      convertView.setLayoutParams(param);  
最后再return convertView即可。

demo可参考下篇文章: 阻尼回弹效果的ScrollView嵌套GridView
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 成功人士的7个习惯 小学数学学习习惯 高效能人士的七个习惯 高效能人士七个习惯 如何养成良好学习习惯 21天养成一个好习惯 培养孩子的良好习惯 怎样培养孩子的阅读习惯 怎样养成良好的学习习惯 培养孩子的阅读习惯 如何培养学生的良好习惯 如何培养孩子阅读习惯 怎样养成好的学习习惯 怎样培养孩子的学习习惯 培养幼儿的良好习惯 养成良好的阅读习惯 如何培养孩子的习惯 养成良好的学习习惯 如何养成好的学习习惯 怎样养成良好的习惯 怎么养成好的学习习惯 如何养成良好的习惯 养成良好的卫生习惯 怎么培养孩子的习惯 培养孩子好的学习习惯 如何培养幼儿良好的习惯 如何培养好的学习习惯 如何培养学生的学习习惯 如何培养幼儿的学习习惯 让优秀成为一种习惯 小学生数学学习习惯的培养 如何培养孩子的行为习惯 中学生不良学习习惯 优秀孩子的16个习惯 怎样培养学生的学习习惯 高效率人士的七个习惯 怎么培养孩子的学习习惯 如何培养学生学习习惯 如何培养孩子的良好学习习惯 怎样培养孩子好的学习习惯 如何培养学生良好的阅读习惯