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

  最近有个需求就是,网格状显示,且需要自适应高度(不出现滚动条,如果有滚动条就需要考虑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);
    }

你可能感兴趣的:(安卓学习,安卓UI)