GridView的高度自适应

接着上面一篇文章。

当GridView不知道parent高度的时候,也就是MeasureSpec是UNSPECIFIED,这个时候,GridView高度为第一个child的高度,并显示滚动条。

 1         mItemCount = mAdapter == null ? 0 : mAdapter.getCount();
 2         final int count = mItemCount;
 3         if (count > 0) {
 4             final View child = obtainView(0, mIsScrap);
 5
 6             AbsListView.LayoutParams p = (AbsListView.LayoutParams) child.getLayoutParams();
 7             if (p == null) {
 8                 p = (AbsListView.LayoutParams) generateDefaultLayoutParams();
 9                 child.setLayoutParams(p);
10             }
11             p.viewType = mAdapter.getItemViewType(0);
12             p.forceAdd = true;
13
14             int childHeightSpec = getChildMeasureSpec(
15                     MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 0, p.height);
16             int childWidthSpec = getChildMeasureSpec(
17                     MeasureSpec.makeMeasureSpec(mColumnWidth, MeasureSpec.EXACTLY), 0, p.width);
18             child.measure(childWidthSpec, childHeightSpec);
19
20             childHeight = child.getMeasuredHeight();
21             childState = combineMeasuredStates(childState, child.getMeasuredState());
22
23             if (mRecycler.shouldRecycleViewType(p.viewType)) {
24                 mRecycler.addScrapView(child, -1);
25             }
26         }
27
28         if (heightMode == MeasureSpec.UNSPECIFIED) {
29             heightSize = mListPadding.top + mListPadding.bottom + childHeight +
30                     getVerticalFadingEdgeLength() * 2;
31         }
32
33         if (heightMode == MeasureSpec.AT_MOST) {
34             int ourSize =  mListPadding.top + mListPadding.bottom;
35
36             final int numColumns = mNumColumns;
37             for (int i = 0; i < count; i += numColumns) {
38                 ourSize += childHeight;
39                 if (i + numColumns < count) {
40                     ourSize += mVerticalSpacing;
41                 }
42                 if (ourSize >= heightSize) {
43                     ourSize = heightSize;
44                     break;
45                 }
46             }
47             heightSize = ourSize;
48         }

我们可以发现,确实是只设置为第一个child的高度,当MeasureSpec是AT_MOST的时候,才会读取所有child的高度。

再网上,搜到了下面的办法。

1 heightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE, MeasureSpec.AT_MOST);

其实这是不对的,MeasureSpec的前两个bits是mode,size的大小不能超过30位。于是,稍微修改,size设置为1000000,应该是足够了,当不足够的时候,你的app如果还没更新早就该被淘汰了。

1 heightMeasureSpec = MeasureSpec.makeMeasureSpec(1000000, MeasureSpec.AT_MOST);

时间: 2024-10-23 12:27:19

GridView的高度自适应的相关文章

ExpandableListView 里面嵌套GridView实现高度自适应

很早之前做过一个商城的app 也是第一次做安卓. 实现的效果如下: 因为一开始做安卓,很多写的代码都不规范,在下面上代码的地方,还请高手指点(勿喷,楼主是自尊心很强的屌丝) 这个效果要解决2个大问题, 第一个是ExpandableListView 如何放置gridview  ,这个比较好做 思路就是adapter里实现 第二个是在ExpandableListView里面展开后,GirdView如何能充满ExpandableListView的item, 就是楼上的效果 好,先来解决第一个.如何放置

Android 让GridView的高度为Wrap_content根据内容自适应高度

From:http://www.jayway.com/2012/10/04/how-to-make-the-height-of-a-gridview-wrap-its-content/ 如果把GridView放到一个垂直方向滚动的布局中,设置其高度属性为 wrap_content ,则该GridView的高度只有一行内容,其他内容通过滚动来显示. 如果你想让该GridView的高度为所有行内容所占用的实际高度,则可以通过覆写GridView的 onMeasure 函数来修改布局参数: packa

android设置GridView高度自适应,实现全屏铺满效果

使GridView每个item的高度自适应拉伸,达到整个GridView刚好铺满全屏的效果. public static void setGridViewMatchParent(GridView gridView ) { // 获取gridView的adapter ListAdapter adapter = gridView.getAdapter(); if (adapter == null) { return; } // 固定列宽,有多少列 int col = 2;// gridView.ge

Android动态设定GridView的高度,固定column,实现高度自适应

动态设定GridView的高度,固定column,根据gridview中的item个数设定高度: 调用以下方法: [java] view plaincopy public static void setListViewHeightBasedOnChildren(GridView listView) { // 获取listview的adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) {

GridView中item高度自适应

public class MyAdapter extends BaseAdapter {         GridView mGv;        public static int ROW_NUMBER = 5;     public MyAdapter (GridView gv, Context mContext, ArrayList<String> list) {         this.context = mContext;         this.mGv = gv;       

动态设定GridView的高度,固定column,实现高度自适应

动态设定GridView的高度,固定column,根据gridview中的item个数设定高度: 调用以下方法: public static void setListViewHeightBasedOnChildren(GridView listView) { // 获取listview的adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } // 固定列宽,有多少列

UI_11 自定义UITableViewCell、Cell的高度自适应

UITableViewCell很难满足我们的需求,因此,CustomCell(自定义单元格)至关重要.下面将通过一个例子演示自定义Cell.第二部分演示根据文本内容自适应Label.Cell高度. 第一部分 CustomCell的创建 1.创建DemoTableViewController,继承自UITableViewController,并设置其为window的根视图 AppDelegate.m - (BOOL)application:(UIApplication *)application

谷歌、火狐浏览器下实现JS跨域iframe高度自适应的完美解决方法,跨域调用JS不再是难题!

谷歌.火狐浏览器下实现JS跨域iframe高度自适应的解决方法 导读:今天开发的时候遇到个iframe自适应高度的问题,相信大家对这个不陌生,但是一般我们都是在同一个项目使用iframe嵌套页面,这个ifame高度自适应网上一搜一大把,今天要讲的如何在不同的网站下进行相互的调用跟在同一个网站下是一个效果:例如我在自己的项目里面Iframe  了第一博客的页面  http://www.diyibk.com/   当第一博客的页面高度变化了怎么通知父页面呢? 这个时候在谷歌下肯定是拿不到 ifram

一个定高,一个高度自适应的布局

Problem:父元素内包含两个子元素,一个定高,另一个高度自适应 Ans: <div class="box">    <div class="ele1"></div>    <div class="ele2"></div></div> (1)  .box {      width:200px;      height:300px;      background:red;