/** * 設置GridView居中 * 當父目錄是RelativeLayout 需要在GridView設置 android:layout_centerHorizontal="true" * 當父目錄是LinearLayout 需要在父目錄設置 android:gravity="center_horizontal" * @param gridView */ public static void calGridViewSumWH(GridView gridView) { int numColumns; int horizontalSpacing; try { numColumns = getFieldValue("mRequestedNumColumns", gridView); if (numColumns < 1) return; horizontalSpacing = getFieldValue("mRequestedHorizontalSpacing", gridView); ListAdapter listAdapter = gridView.getAdapter(); if (listAdapter == null) return; int totalHeight = 0; int totalWidth = 0; int len = listAdapter.getCount(); for (int i = 0; i < len; i++) { View listItem = listAdapter.getView(i, null, gridView); listItem.measure(0, 0); if (i < numColumns) totalWidth+= listItem.getMeasuredWidth(); if ((i + 1) % numColumns == 0 && (i + 1) != len) { if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) { totalHeight += listItem.getMeasuredHeight() + gridView.getVerticalSpacing(); } else { totalHeight += listItem.getMeasuredHeight(); } } if ((i + 1) == len) { totalHeight += listItem.getMeasuredHeight(); } } if (len < numColumns) { gridView.setNumColumns(len); } if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) { totalWidth = totalWidth + horizontalSpacing * (numColumns - 1); } ViewGroup.LayoutParams params = gridView.getLayoutParams(); params.height = totalHeight; params.width = totalWidth; gridView.setLayoutParams(params); } catch (Exception e) { e.printStackTrace(); } } /** * 動態獲取屬性值 * @param attributeName * @param gridView * @return */ public static int getFieldValue(String attributeName, GridView gridView) { try { Field field = GridView.class.getDeclaredField(attributeName); field.setAccessible(true); return Integer.parseInt(field.get(gridView).toString()); } catch (Exception e) { e.printStackTrace(); } return 0; }
然後xml在設置的時候,需要如下設置
<RelativeLayout android:layout_width="130dp" android:layout_height="130dp"> <ImageView android:id="@+id/iv_img" android:layout_centerInParent="true" android:maxHeight="130dp" android:maxWidth="130dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
因爲上述代碼測量得到的寬高會受到圖片大小的影響,一旦圖片大於父容器中設置的130dp,那樣子測量得到的寬高也會變動,導致最後展示的效果會有所偏差。
<RelativeLayout android:paddingTop="25dp" android:paddingBottom="25dp" android:background="@android:color/white" android:layout_width="match_parent" android:layout_height="wrap_content"> <GridView android:id="@+id/ahgv_qualification" android:verticalSpacing="25dp" android:horizontalSpacing="25dp" android:numColumns="2" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout>