ScrollView嵌套GridView,GridView显示不全

原创 2016年04月06日 20:10:05

在ScrollView里布局GridView时,GridView显示往往是以单行显示出来。这是由于GridView和ScrollView里都有滑动属性。

ScrollView无法判断GridView里的item高度是多少,于是只显示单个Item的高度,也就是单行显示了,剩下内容被隐藏了。

要解决的这个问题需要重新测量GridView的高度,下面是一个自定义的GridView控件

public class MyGridView extends GridView {
    public MyGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyGridView(Context context) {
        super(context);
    }

    public MyGridView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int expandSpec = MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

**xml里布局该控件

<com.yourclass.MyGridView 
    android:id="@+id/gridView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    //......这里不再赘述了,自己自行定义
   />

然后在Java代码里调用

    MyGridView gridview = (MyGridView) findViewById(R.id.grid_view);  


这里解释一下。

MeasureSpec代表着一组控件的宽高,MeasureSpec.makeMeasureSpec(int size,int mode)方法是根据提供的大小值和模式创建一个测量值(格式)。

在源代码里可以看到这个:

public static int resolveSize(int size, int measureSpec) {  
         int result = size;  
         int specMode = MeasureSpec.getMode(measureSpec);  
         int specSize =  MeasureSpec.getSize(measureSpec);  
         switch (specMode) {  
         case MeasureSpec.UNSPECIFIED:  
             result = size;  
             break;  
         case MeasureSpec.AT_MOST:  
             result = Math.min(size, specSize);  
             break;  
         case MeasureSpec.EXACTLY:  
             result = specSize;  
             break;  
         }  
         return result;  
     } 

MeasureSpec.AT_MOST模式是返回Math.min(size, specSize)给其他函数,也就是返回Integer.MAX_VALUE >> 2和控件的之间的最小值。当我们正常使用不超过极限值时,返回的就是控件的大小。ScrollView收到GridView的大小,就给GridView全部展开显示了。


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/loongago/article/details/51078031

ScrollView嵌套ListView、GridView,进入页面显示的位置并不是在最顶部,而是在中间部分问题

在Android项目的开发中,经常会遇到一些布局,可能需要在ScrollView中嵌套ListView或、GridView来实现,当然我们都知道ScroView中嵌套ListView、GridView...
  • mq2856992713
  • mq2856992713
  • 2016-12-18 18:02:57
  • 1654

ScrollView嵌套GridView、ListView的那些事儿

尊重他人的劳动成果,转载请标明出处:http://blog.csdn.net/gengqiquan/article/details/53782194, 本文出自:【gengqiquan的博客】在and...
  • gengqiquan
  • gengqiquan
  • 2017-02-13 10:45:49
  • 3402

Android ScrollView嵌套GridView导致GridView只显示一行item

Android ScrollView嵌套GridView导致GridView只显示一行itemAndroid ScrollView在嵌套GridView时候,会导致一个问题发生:GridView只显示...
  • zhangphil
  • zhangphil
  • 2016-08-19 17:08:12
  • 2163

Android开发随笔之ScrollView嵌套GridView

在开发过程总遇到ScrollView嵌套GridView,由于这两种控件都带有滚动条,当他们碰到一起的时候便会出问题,问题是gridview不滚动,并且只显示两行,为此看了官方文档,谷歌回答滚动里面没...
  • lonely_fireworks
  • lonely_fireworks
  • 2012-02-08 15:23:31
  • 27654

Android ScrollView嵌套ListView嵌套GridView的上下拉以及加载更多

  • 2015年11月22日 12:35
  • 2.8MB
  • 下载

Scrollview嵌套Listview 或者gridview 焦点问题

问题先描述清楚: 1,有的时候我们需要通过scrollview嵌套listview 或者gridview   当然 scrollview 上还有其他的UI控件,(button textview im...
  • tiandiyinghun
  • tiandiyinghun
  • 2015-12-13 14:16:47
  • 1812

android ListView/GridView与ScrollView嵌套的滑动冲突解决

首先说一下思路,主要就是去掉子ListView/GridView的内容全部显示出来,使其不需要滑动。然后用ScrollView将其包裹在其中,接管滑动事件,达到整个布局的滑动效果。实际做法需要将Lis...
  • yaosongqwe
  • yaosongqwe
  • 2015-08-06 09:42:04
  • 2836

笔记12--GridView--且解决与ScrollView共用的冲突问题

GridView用法基本逻辑:1)要加载到GridView的数据2)将数据放入适配器3)
  • mwj_88
  • mwj_88
  • 2014-04-07 11:40:33
  • 19264

ScrollView中嵌套 GridView 导致 ScrollView默认不停留在顶部的解决办法

ScrollView中嵌套 GridView 导致 ScrollView默认不停留在顶部的解决方案和分析 发生情况大概是我在ScrollView底部放了个GridView 来实现一个类似9宫格效果的...
  • DJS168888
  • DJS168888
  • 2015-11-05 17:09:26
  • 982

Android ScrollView 嵌套ListView与GridView的最终解决方案

前言:(由于时间紧,这里只提供思路,和简单代码片段,如果是纯拿来主义,什么都不看就直接用,本文章是满足不了的)项目中难免会遇到ScrollView与ListView等控件的嵌套,而这些控件的嵌套会出现...
  • sunxiaogang0214
  • sunxiaogang0214
  • 2016-09-18 16:58:29
  • 247
收藏助手
不良信息举报
您举报文章:ScrollView嵌套GridView,GridView显示不全
举报原因:
原因补充:

(最多只允许输入30个字)