Android 動態設定 ListView 和 GridView 高度
阿新 • • 發佈:2019-02-07
1 需求分析
我們可能會有這樣的需求,ListView添加了一個頭部,然後頭部裡面有一個ListView或者GridView,當你按照正常的方式給頭部的ListView或者GridView設定資料的時候,發現它只能顯示一行!!!這可不是我想要的。
那麼怎麼辦呢?最直接的辦法,就是在xml佈局中給頭部的ListView或者GridView設定固定的高度。雖然這樣可以出來效果,但是顯然不是我想要的。因為資料不能確定,高度也不會固定,設定固定高度怎麼可以!!!
既然如此,那就在程式碼中為他們動態設定高度吧。
最重要的,也是最關鍵的就是怎麼計算ListView和GridView的高度。
2 演算法分析
ListView
要計算ListView的高度,很簡單啊。首先,得知道有多少條資料,迴圈計算每一條item的高度,把他們相加就得出了總的高度。
GridView
要計算GridView的高度,方法類似,只不過要考慮到列數。比如有12條資料,設定為5列,那麼就有三行資料。只要我們得到每一行的高度,然後再相加,就是我們想要的結果。
3 程式碼實現
ListView
//為listview動態設定高度(有多少條目就顯示多少條目) public void setListViewHeight(ListView listView) { //獲取listView的adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; //listAdapter.getCount()返回資料項的數目 for (int i = 0,len = listAdapter.getCount(); i < len; i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } // listView.getDividerHeight()獲取子項間分隔符佔用的高度 // params.height最後得到整個ListView完整顯示需要的高度 ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter .getCount() - 1)); listView.setLayoutParams(params); }
//使用方式,必須重新整理Adapter
setListViewHeight(listView);
listViewAdapter.notifyDataSetChanged();
GridView
public void setGridViewHeight(GridView gridview) { // 獲取gridview的adapter ListAdapter listAdapter = gridview.getAdapter(); if (listAdapter == null) { return; } // 固定列寬,有多少列 int numColumns= gridview.getNumColumns(); //5 int totalHeight = 0; // 計算每一列的高度之和 for (int i = 0; i < listAdapter.getCount(); i += numColumns) { // 獲取gridview的每一個item View listItem = listAdapter.getView(i, null, gridview); listItem.measure(0, 0); // 獲取item的高度和 totalHeight += listItem.getMeasuredHeight(); } // 獲取gridview的佈局引數 ViewGroup.LayoutParams params = listView.getLayoutParams(); // 設定高度 params.height = totalHeight; // 設定引數 gridview.setLayoutParams(params); }
//使用方式,必須重新整理Adapter
setGridViewHeight(gridView);
gridViewAdapter.notifyDataSetChanged();