如何将wrap_content指定为动态加载的gridview的高度

时间:2014-01-31 14:53:55

标签: android gridview

我正在使用按钮动态加载gridview。所以我正在使用scrollview,但如果我将wrap_content指定为gridview的高度,则不会显示所有按钮。我不想为gridview指定任何静态高度。 这是我正在使用的代码:

<ScrollView
                 xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent" >

              <LinearLayout
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:orientation="vertical"
                  android:paddingLeft="5dip"
                  android:paddingRight="5dip" >

                  <GridView
                      android:id="@+id/gridviewtable"
                      android:layout_width="fill_parent"
                      android:layout_height=wrap_content"
                      android:horizontalSpacing="10dp"
                      android:numColumns="4"
                      android:verticalSpacing="10dp" >
                  </GridView>

              </LinearLayout>
          </ScrollView>

5 个答案:

答案 0 :(得分:4)

您需要创建一个新类,例如

public class WrappingGridView extends GridView {

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

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

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

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int heightSpec = heightMeasureSpec;
    if (getLayoutParams().height == LayoutParams.WRAP_CONTENT) {
        // The great Android "hackatlon", the love, the magic.
        // The two leftmost bits in the height measure spec have
        // a special meaning, hence we can't use them to describe height.
        heightSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
    }
    super.onMeasure(widthMeasureSpec, heightSpec);
}

}

您还需要更改XML

<com.your.project.WrappingGridView
                android:id="@+id/gridviewtable"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:horizontalSpacing="10dp"
                android:numColumns="4"
                android:verticalSpacing="10dp"/>

最后在您的java类中,您需要将对象GridView转换为WrappingGridView

答案 1 :(得分:2)

试试这个

int totalHeight = (count / <number of items in a row>);

    if (count % <number of items in a row> != 0) {
        totalHeight++;
    }

    ViewGroup.LayoutParams params = gridview.getLayoutParams();

    params.height = <height of a row> * totalHeight;

    gridview.setLayoutParams(params);
    gridview.requestLayout();

答案 2 :(得分:0)

android:layout_height="wrap_content"不能用于AdapterView的子类(例如ListView和GridView)。 GridView必须获得每行的高度才能计算出自己的高度。

删除ScrollViewLinearLayout,您不需要它们。 GridView已经内置了自己的滚动逻辑。

答案 3 :(得分:0)

这或类似的东西应该这样做。 (我记得的代码) myImageView.setLayoutParams(new ImageView.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, (LinearLayout.LayoutParams.WRAP_CONTENT));

答案 4 :(得分:0)

这是弗兰肯斯坦在我面前的许多答案,但到目前为止,它是唯一对我有用的东西:

private static void resizeGridView(GridView gridView, int rows) {
    int measuredHeight = gridView.getMeasuredHeight();
    ViewGroup.LayoutParams params = gridView.getLayoutParams();
    params.height = measuredHeight * rows;
    gridView.setLayoutParams(params);
    gridView.requestLayout();
}

在您更新要显示到gridView的内容后调用此方法。