在Android中获取GridView实际列宽

时间:2013-01-06 22:08:23

标签: android android-gridview

Hello开发人员。

我在Android应用程序中有一个网格视图。网格视图具有自动适合列数的设置,最小列宽为250像素。

在网格单元格中,我有一个LinearLayout,它有一个图像视图和一些文本视图。

我希望我的图像视图始终是方形的,但遗憾的是我无法使用任何布局设置执行此操作(如果有错误的选项,请在此处打开建议)。

所以我的想法是我应该以某种方式在我的图像Loading类中获取网格列宽度并在那里动态调整imageView高度,以匹配宽度。

虽然我没有获得列宽。 如果我在public View getView(int position, View convertView, ViewGroup parent)中设置了breakPoint,我看到我的父ViewGroup是Grid,它具有正确的列宽值,但是当我使用时:

GridView mGridView = (GridView)parent;
int width = mGridView.getColumnWidth();

应用程序崩溃,因为它说没有getColumnWidth方法。

这里有任何帮助吗?

3 个答案:

答案 0 :(得分:6)

以防万一有人正在寻找一种方法来获得实际的columnWidth pre api 16(就像我看到这篇帖子时那样),这就是我检索它的方法。

我扩展了GridView并使用这个

覆盖了getColumnWidth方法
@SuppressLint("NewApi")
@Override
public int getColumnWidth() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
        return super.getColumnWidth();
    else {
        try {
            Field field = GridView.class.getDeclaredField("mColumnWidth");
            field.setAccessible(true);
            Integer value = (Integer) field.get(this);
            field.setAccessible(false);

            return value.intValue();
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
}

答案 1 :(得分:5)

解决方案可能是根据您的要求扩展您的ImageView并覆盖onMesure()方法:

onMeasure(int widthMeasureSpec, int heightMeasureSpec){
   super.onMeasure(widthMeasureSpec,heightMeasureSpec);
   setMeasuredDimension(getMeasuredWidth(),getMeasuredWidth());

}

答案 2 :(得分:1)

Daniel Bo的回答是人工计算价值:

private int getColumnWidth(Context context, GridView gridView) {
    if (android.os.Build.VERSION.SDK_INT >= 16)
        return gridView.getColumnWidth();

    Resources res = context.getResources();
    int lPad = (int)res.getDimension(R.dimen.left_padding);
    int rPad = (int)res.getDimension(R.dimen.right_padding);
    int hSpace = (int)res.getDimension(R.dimen.horizontal_spacing);
    int cols = gridView.getNumColumns();
    int width = gridView.getWidth();

    return (width - lPad - rPad + hSpace) / cols - hSpace;
}

请注意,这仅适用于高于11(Honeycomb)的API,并假设您使用一些定义为资源的值设置GridView。例如,假设您有一个dimens.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="left_padding">4dp</dimen>
    <dimen name="right_padding">8dp</dimen>
    <dimen name="horizontal_spacing">2dp</dimen>
</resources>

然后你的布局XML文件有:

<GridView
    ...
    android:horizontalSpacing="@dimen/horizontal_spacing"
    android:paddingLeft="@dimen/left_padding"
    android:paddingRight="@dimen/right_padding"
    ...
    />

如果您有许多类似的GridView,那么将这些属性放在自定义样式中可能是个好主意。

至少这对我有用,而不必使用反射。请注意,经常调用此函数可能会有点过分。

希望这有助于某人。