scrollview與listview、gridview嵌套高度衝突解決思路
網上說了2種辦法:一種是重寫listview和gridview。不過這個方法有個問題,如果你的listview或者gridview設置了分割線高度。最後的計算結果會忽略掉分割線的高度,導致現實不全。
第二種方法是寫一個工具類對listview的高度進行重算,計算完設置listview的高度,這個方法試過可行,有把分割線也計算進去。不過網上都是 listview的計算。缺少gridview的,因此在這裏補充上。由於gridview計算的高度不能直接根據數據總數,需要判斷每行顯示的個數。以 及最後一行是否全部顯示。需要多幾個判斷。代碼如下:
計算listview高度的代碼
public static void setListViewHeightBasedOnChildren(ListView listView) { // 獲取ListView對應的Adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { // pre-condition return; } int totalHeight = 0; for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回數據項的數目 View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); // 計算子項View 的寬高 totalHeight += listItem.getMeasuredHeight(); // 統計所有子項的總高度 } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); // listView.getDividerHeight()獲取子項間分隔符占用的高度 // params.height最後得到整個ListView完整顯示需要的高度 listView.setLayoutParams(params); }
計算gridview高度的代碼
public static void setGridViewHeightBasedOnChildren(GridView gridView) { // 獲取GridView對應的Adapter ListAdapter listAdapter = gridView.getAdapter(); if (listAdapter == null) { return; } int rows; int columns=0; int horizontalBorderHeight=0; Class<?> clazz=gridView.getClass(); try { //利用反射,取得每行顯示的個數 Field column=clazz.getDeclaredField("mRequestedNumColumns"); column.setAccessible(true); columns=(Integer)column.get(gridView); //利用反射,取得橫向分割線高度 Field horizontalSpacing=clazz.getDeclaredField("mRequestedHorizontalSpacing"); horizontalSpacing.setAccessible(true); horizontalBorderHeight=(Integer)horizontalSpacing.get(gridView); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } //判斷數據總數除以每行個數是否整除。不能整除代表有多餘,需要加一行 if(listAdapter.getCount()%columns>0){ rows=listAdapter.getCount()/columns+1; }else { rows=listAdapter.getCount()/columns; } int totalHeight = 0; for (int i = 0; i < rows; i++) { //隻計算每項高度*行數 View listItem = listAdapter.getView(i, null, gridView); listItem.measure(0, 0); // 計算子項View 的寬高 totalHeight += listItem.getMeasuredHeight(); // 統計所有子項的總高度 } ViewGroup.LayoutParams params = gridView.getLayoutParams(); params.height = totalHeight+horizontalBorderHeight*(rows-1);//最後加上分割線總高度 gridView.setLayoutParams(params); }
最後更新:2017-04-03 06:03:05
上一篇:
解決:<net.sf.ehcache.util.UpdateChecker> : New update(s) found: 2.6.5
下一篇:
iPhone開發初探
無人駕駛、配送機器人背後的技術 - PostGIS點雲(pointcloud)應用實踐
創建代碼生成器可以很簡單:如何通過T4模板生成代碼?[上篇]
SSH2->Spring Framework2 struts2 hibernate
"太極大師”戰不過10秒,武術大師連廣場舞大媽都打不過? 武術已成熱點話題!
Tomcat的設置1——設置根目錄
JSTL提供的函數標簽操作EL表達式字的符串
Oracle中imp命令使用出錯——未知命令開頭
HTAP數據庫 PostgreSQL 場景與性能測試之 9 - (OLTP) 字符串模煳查詢 - 含索引實時寫入
1到n的全排列
【進程線程與同步】5.2 避免在同一機器上運行同一程序的多個實例