Android 動態設置 ListView 和 GridView 高度

jiazhibin 7年前發布 | 24K 次閱讀 ListView Android開發 移動開發 gridview

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();

 

來自:http://www.jianshu.com/p/141ca9c140e4

 

 本文由用戶 jiazhibin 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!