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