2013-01-06 77 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