2013-01-06 51 views
4

Hello同行开发者。在Android中获取GridView实际列宽

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

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

我希望我的图片浏览能始终平方米,但遗憾的是我没能有任何版面设置要做到这一点(开在这里建议,如果有选择,我错过)。

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

虽然我没有获得列宽。 如果我在public View getView(int position, View convertView, ViewGroup parent)设置一个断点,我看到我的父母的ViewGroup是网格和它的列宽的正确值,但是当我使用:

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

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

这里有什么帮助吗?

+0

getColumnWidth从API 16添加,您可能正在运行在较旧版本的Android中。 –

回答

5

该解决方案可根据您的需求来扩展您的ImageView和压倒一切的onMesure()方法:

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

} 
+0

谢谢,我会尝试一下,让你知道! – Lefteris

+0

它像一个魅力工作! – Lefteris

+0

在此先感谢 – Mojiiz

6

万一有人正在寻找一种方式来获得实际columnWidth时前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

丹尼尔博的回答另一种方法是手动计算值:

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(Honeycomb),并且假设你设置了一些定义为资源的值。例如考虑你有一个有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的,它可能是一个好主意将这些属性放在自定义样式中。

至少这为我工作,而不必使用反射。请注意,经常调用此函数可能会矫枉过正。

希望这可以帮助别人。

+0

因为getNumColumns是api 11调用,如果您想要进一步回退,则无法使用。 –

+0

感谢您的回复=)我会在答案上发出警告。 –

+0

感谢您使用这种方法。 – box