给项目进行平板的适配。找到平板运行了一下,看看效果,基本问题不大。只是对于首页的GridView显示的列数需要改一下。原先我是使用android:numColumns="3",一行显示3列。那么运行在了平板上就显得间隔太大,所以我准备显示4列。

那么我立马想到的是使用:

android:numColumns="auto_fit"

android:columnWidth="120dp"

大家都清楚这是设置GridView列宽并尽可能的填满可用空间。会随着屏幕的大小自动调节列数的。

运行在了手机与平板上以后,手机显示3列正常,两个平板,一个4列,一个5列。

无语了。。明明两个平板基本一样大啊!只是分辨率不同。一个1080*1920,一个1200*1920。

那么没办法,只有查看一下GridView源码,看看auto_fit怎么实现的。

找了一会发现了determineColumns方法,就如名字一样“确定列数”

private boolean determineColumns(int availableSpace) {final int requestedHorizontalSpacing = mRequestedHorizontalSpacing;final int stretchMode = mStretchMode;final int requestedColumnWidth = mRequestedColumnWidth;boolean didNotInitiallyFit = false;if (mRequestedNumColumns == AUTO_FIT) {if (requestedColumnWidth > 0) {// Client told us to pick the number of columnsmNumColumns = (availableSpace + requestedHorizontalSpacing) /(requestedColumnWidth + requestedHorizontalSpacing);} else {// Just make up a number if we don't have enough infomNumColumns = 2;}} else {// We picked the columnsmNumColumns = mRequestedNumColumns;}if (mNumColumns <= 0) {mNumColumns = 1;}

这里只截取了部分。写得很清楚,如果没有设置auto_fit那么就用设置的固定值,如果固定值小于等于0,列数就是1。如果设置了auto_fit,但是没有设置列宽,默认两列。有设置列宽,则根据availableSpace除列宽计算列数。

追踪availableSpace

 @Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// Sets up mListPaddingsuper.onMeasure(widthMeasureSpec, heightMeasureSpec);int widthMode = MeasureSpec.getMode(widthMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);if (widthMode == MeasureSpec.UNSPECIFIED) {if (mColumnWidth > 0) {widthSize = mColumnWidth + mListPadding.left + mListPadding.right;} else {widthSize = mListPadding.left + mListPadding.right;}widthSize += getVerticalScrollbarWidth();}int childWidth = widthSize - mListPadding.left - mListPadding.right;boolean didNotInitiallyFit = determineColumns(childWidth);

由上面可以看到availableSpace是GridView的宽度,单位是px,我们设置的宽度单位是dp。也就是第一段的requestColumnWidth

追踪requestColumnWidth

    /*** Set the width of columns in the grid.** @param columnWidth The column width, in pixels.** @attr ref android.R.styleable#GridView_columnWidth*/public void setColumnWidth(int columnWidth) {if (columnWidth != mRequestedColumnWidth) {mRequestedColumnWidth = columnWidth;requestLayoutIfNecessary();}}

追踪columnWidth

int columnWidth = a.getDimensionPixelOffset(R.styleable.GridView_columnWidth, -1);if (columnWidth > 0) {setColumnWidth(columnWidth);}

那么到这里很清楚了,dp转化为了px。

dp转化为px这个工具方法大家一定没有少用,如下:

/*** * 将dip或dp值转换为px值,保证尺寸大小不变 * * @param dipValue * @param scale ** (DisplayMetrics类中属性density) * @return*/public static int dip2px(Context context, float dipValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dipValue * scale + 0.5f);}

这里有个destiny,这个是什么。老规矩查看源码:

/*** The logical density of the display.  This is a scaling factor for the* Density Independent Pixel unit, where one DIP is one pixel on an* approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen), * providing the baseline of the system's display. Thus on a 160dpi screen * this density value will be 1; on a 120 dpi screen it would be .75; etc.*  * <p>This value does not exactly follow the real screen size (as given by * {@link #xdpi} and {@link #ydpi}, but rather is used to scale the size of* the overall UI in steps based on gross changes in the display dpi.  For * example, a 240x320 screen will have a density of 1 even if its width is * 1.8", 1.3", etc. However, if the screen resolution is increased to * 320x480 but the screen size remained 1.5"x2" then the density would be * increased (probably to 1.5).** @see #DENSITY_DEFAULT*/public float density;

大概意思是说他是一个相对的屏幕密度。在160dpi的屏幕上1dp=1px,也就是mdpi。hdpi时1dp=1.5px,xhdpi时1dp=2px,xxhdpi时1dp=3px。

总结一下:px与dp之间的倍数就是density,而density的值由分辨率和屏幕尺寸决定。

之后我打Log看看手机和平板的density。

那么手机(分辨率1920*1080)是2.75,屏幕宽1080/2.75=393dp(3列)

平板1号(分辨率1920*1200)是2,屏幕宽1200/2=600dp  (5列)

平板2号(分辨率1920*1080)是2,屏幕宽1080/2=540dp  (4列)

还记得我columnWidth设置的是多少?120dp

真是无语了600/120=5列,这个平板的分辨率我也是醉了。安卓的碎片化。。

那么找到了原因,也就好修改了,我通过计算屏幕宽的dp,如果大于480dp就设置4列。

其实解决这个适配需求还有许多好的方法。

分享出来,仅供参考。

使用GridView的auto_fit遇到的坑相关推荐

  1. Android踩坑日记:使用Fesco图片加载库在GridView上的卡顿优化

    1,fresco是一个强大的图片加载库 2,fresco设计了一个叫做image pipeline(图片管道)的模块,它负责从从网络,从本地文件系统,从本地资源加载图片,为了最大限度节约资源和cpu时 ...

  2. 踏平RecyclerView使用的各种坑,跟ListView和GridView说拜拜

    RecyclerView是谷歌推出的新View,使用和listview差不多. 在此之前推荐一本书:跟着敲一遍你能从中级变高级,从习惯eclipse变成使用Android studio大神. 但是Re ...

  3. GridView 与ImageAdapter (笔记)

    为什么80%的码农都做不了架构师?>>> xml布局文件: <RelativeLayout xmlns:android="http://schemas.android ...

  4. Android入门第八篇之GridView(九宫图)

    本文来自http://blog.csdn.net/hellogv/ GridView跟ListView都是比較经常使用的多控件布局,而GridView更是实现九宫图的首选!本文就是介绍怎样使用Grid ...

  5. 安卓gridview 网格,多行多列实现

    主Activity() private int[] image = { R.drawable.camera, R.drawable.wifi, R.drawable.temperature,R.dra ...

  6. android gridview item 点击,Android-取消GridView/ListView item被点击时的效果

    方法一,在控件被初始化的时候设置 gridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); listView.setSelector(ne ...

  7. Android中GridView的实现实例

    实现效果: activity文件代码: package com.tmacsky; import android.app.Activity; import android.os.Bundle; impo ...

  8. Android开发之GridView的使用(解读谷歌官方API)

    GridView将图片显示在二维可移动的网格里,使用ListAdapter可以将Grid项目自动填充满整个布局.下面我们根据官方文档的例子来实现一下使用GridView,点击视图里的图片弹出图片的po ...

  9. Android PullToRefresh (ListView GridView 下拉刷新) 使用详解

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38238749,本文出自:[张鸿洋的博客] 群里一哥们今天聊天偶然提到这个git ...

  10. Android中用GridView实现九宫格的两种方法

    1.传统办法:实现一个继承BaseAdapter的 ImageAdapter java代码如下: [java] view plaincopy package com.test; import andr ...

最新文章

  1. 嘿嘿,我就知道面试官接下来要问我 ConcurrentHashMap 底层原理了,看我怎么秀他...
  2. MyBatis Mapper 文件例子
  3. erlang-百度云推送Android服务端功能实现-erlang
  4. 怎么避免UpdateData()函数弹出对话框
  5. 《在你身边,为你设计》-哪位知道下载、在线阅读地址啊?
  6. leetcode537. 复数乘法
  7. MySQL数据库数据分开存储
  8. laravel 分词搜索匹配度_搜索引擎工作原理
  9. 大数据分析实战-信用卡欺诈检测
  10. Node.js目录操作
  11. 4键电子手表说明书_数字S1系统4.3寸门口主机操作说明书
  12. 关于mysql查询_关于mysql的查询
  13. 计算机专业毕业生的就业政策,计算机专业毕业生就业情况分析及应对策略
  14. WPS 从今以后我再也不会用了 记录一下!
  15. python实现某网站的音乐下载
  16. PHP 7.1 新特性
  17. 600岁的故宫,已经越来越飘了!
  18. 投影仪软件哪个好用?装上一起看TV,解锁追剧新体验
  19. IE浏览器输入框反应慢的解决方式
  20. Rootkit For Windows(1)

热门文章

  1. 【asp.net】VS 2008中文版下载
  2. 线性系统实验:化学方程式配平 与 天体轨道参数估计
  3. 你用过猿如意吗?猿如意可以使用ChatGPT哦,这里详细介绍了猿如意的功能,为什么我建议你使用猿如意,来看看吧
  4. windows批量部署
  5. 轻量易用的网站bug与性能监控平台——灵雀应用监控平台
  6. Java-获取本地主机的域名和主机名(net)
  7. 学生静态网页设计作品之我的家乡
  8. SQL学习笔记(05)_JOIN的类型与用法
  9. Python Prep随想练习-Day3
  10. 瀚高数据库php连接,HighGo瀚高数据库4.3版本安装说明