5

各位开发者您好。

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

在网格单元格内,我有一个具有图像视图和一些文本视图的 LinearLayout。

我希望我的图像视图始终是方形的,但不幸的是,我无法使用任何布局设置来做到这一点(如果我错过了一个选项,请在此处接受建议)。

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

我没有得到列宽。如果我在我的设置一个断点,我 public View getView(int position, View convertView, ViewGroup parent)会看到我的父 ViewGroup 是 Grid 并且它具有正确的列宽值,但是当我使用时:

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

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

这里有什么帮助吗?

4

3 回答 3

6

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

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

}
于 2013-01-07T00:10:41.840 回答
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);
        }
    }
}
于 2013-11-06T15:35:46.153 回答
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,最好将这些属性放在自定义样式中。

至少这对我有用,而不必使用反射。请注意,频繁调用此函数可能会过大。

希望这可以帮助某人。

于 2014-01-12T16:06:47.403 回答