1. 程式人生 > >Android 動態設定 ListView 和 GridView 高度

Android 動態設定 ListView 和 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();