您的位置:首页 > 移动开发 > Android开发

Android GridView自适应高度(不出现滚动条)

2017-09-17 10:13 465 查看
  最近有个需求就是,网格状显示,且需要自适应高度(不出现滚动条,如果有滚动条就需要考虑GrideView互相嵌套的滑动事件编写了,虽然不麻烦,但布局看起来却不一定好看),大概看了一下网上的解决方法,最终采用了如下方案:

  

public class MyGridView extends GridView {

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

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

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

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

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

}

@Override
public int getNumColumns() {//可以不复写,但必须在xml中声明android:numColumns="3"
return 3;
}
}


xml:

<com.xx.view.MyGridView
android:id="@+id/legend_grid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:stretchMode="columnWidth"
android:layout_margin="20dp"
android:numColumns="3"/>


  另外,提供大家一个可以不用复写GrideView的方法,但要每次更新数据后都用该方法设置一下高度(同样需要在xml中配置GridView的 android:numColumns):

  

/**
* gridview计算高度
* */
public static void setGridViewHeightByChildren(GridView gridView){
//获取gridview高度
ListAdapter listAdaper=gridView.getAdapter();
if(listAdaper==null){
return;
}
//总高度
int totalHeight=0;
//计算行数 向上取整
int lineNum=Math.ceil((double)listAdaper.getCount()/(double)gridView.getNumColumns());
View item=listAdaper.getView(0,null,gridView);
item.measure(0,0);
//获取高度和
totalHeight=item.getMeasuredHeight()*lineNum;
//布局参数
ViewGroup.LayoutParams params=gridView.getLayoutParams();
//设置布局高度
params.height=totalHeight;
//设置margin
((ViewGroup.MarginLayoutParams)params).setMargins(10,10,10,10);
//设置参数
gridView.setLayoutParams(params);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息