Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取Android中GridView的实际列宽_Android_Android Gridview - Fatal编程技术网

获取Android中GridView的实际列宽

获取Android中GridView的实际列宽,android,android-gridview,Android,Android Gridview,各位开发者好 我在android应用程序中有一个网格视图。栅格视图具有自动适应列数的设置,最小列宽为250像素 在网格单元中,我有一个LinearLayout,它有一个图像视图和一些文本视图 我希望我的图像视图始终是方形的,但不幸的是,我无法使用任何布局设置来实现这一点(如果我错过了一个选项,请在此处接受建议) 所以我的想法是,我应该在图像加载类中以某种方式获得网格列宽度,并在那里动态调整imageView高度,以匹配宽度 但是我没能得到列宽。 如果我在我的公共视图getView(int位置,视

各位开发者好

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

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

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

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

但是我没能得到列宽。 如果我在我的
公共视图getView(int位置,视图转换视图,视图组父视图)
中设置断点,我会看到我的父视图组是网格,它具有正确的列宽值,但是当我使用:

GridView mGridView = (GridView)parent;
int width = mGridView.getColumnWidth();
应用程序崩溃,因为它说没有getColumnWidth方法


有什么帮助吗?

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

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

}

以防有人在寻找获取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);
        }
    }
}

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;
}
请注意,这仅适用于API高于11(蜂巢)的情况,并假设您使用一些定义为资源的值设置GridView。例如,您有一个DimeSS.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>

4dp
8dp
2dp
然后,布局XML文件具有:

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

如果您有许多类似的GridView,最好将这些属性设置为自定义样式

至少这对我来说是有效的,不需要使用反射。请注意,频繁调用此函数可能有些过分


希望这对其他人有所帮助。

getColumnWidth是从API 16添加的,您可能正在旧版本的android中运行。谢谢,我会尝试一下并让您知道!由于getNumColumns是一个api 11调用,如果您想进一步向后移植,就不能使用它。感谢catch=)我将在答案上添加一个警告。感谢它的有用方法。