1. 程式人生 > >計算ListView的高度終極版,考慮到多行textview的情況

計算ListView的高度終極版,考慮到多行textview的情況

在一些時候,我們需要計算Listview的情況,一般來說,網上的許多程式碼都可以完成計算高度,但是如果遇到textview多行的情況,往往發現計算就不準確了,我找了網上一些方案,結合自己的實驗,給出一套最終的解決方案,希望對大家有所幫助


        

[java]  view plain  copy
  1. private int getListviewHeight(ListView pull) {  
  2.   
  3.         ListAdapter listAdapter = pull.getAdapter();  
  4.         if (listAdapter == null) {  
  5.             return
     0;  
  6.         }  
  7.   
  8.         DisplayMetrics dm =getResources().getDisplayMetrics();  
  9.         int w_screen = dm.widthPixels;  
  10.   
  11.         int totalHeight = 0;  
  12.         int listViewWidth = w_screen-dip2px(this,16);                                         //listView在佈局時的寬度  
  13.         int widthSpec = View.MeasureSpec.makeMeasureSpec(listViewWidth, View.MeasureSpec.AT_MOST);  
  14.         for (int i = 0; i < listAdapter.getCount(); i++) {  
  15.             View listItem = listAdapter.getView(i, null, pull);  
  16.             listItem.measure(widthSpec, 0);  
  17.   
  18.             int itemHeight = listItem.getMeasuredHeight();  
  19.             totalHeight += itemHeight;  
  20.         }  
  21.         // 減掉底部分割線的高度  
  22.         int historyHeight = totalHeight  
  23.                 + (pull.getDividerHeight() * listAdapter.getCount() - 1);  
  24.   
  25.         return  historyHeight;  
  26.   
  27.     }  
其中 dip2px的將dp的數值轉化為對應px,實現方法如下:

[java]  view plain  copy
  1. public static int dip2px(Context context, float dipValue){  
  2.        final float scale = context.getResources().getDisplayMetrics().density;  
  3.        return (int)(dipValue * scale + 0.5f);  
  4.    }  

經過筆者驗證,無論textview多少行,計算出來的高度是正確的,與網上許多程式碼不同的地方,就是

[java]  view plain  copy
  1. listItem.measure(widthSpec, 0);  
網上傳入的引數基本都是(0,0),這到底有什麼區別呢?在實現listview的時候,我們往往不會貼邊顯示,所以會左右之間留有一定的空間,如果傳入的(0,0),然後程式碼去measure,就會出錯,它把你左右的間隙也計算進去了,單行的時候textview還好,如果是多行,錯誤會非常明顯。

這個函式實現傳入的第一個引數就是listview中,每一項item的實際寬度,所以上面的程式碼有一句是

[java]  view plain  copy
  1. int listViewWidth = w_screen-dip2px(this,16);    


其中16,就是我程式碼中舉例左邊的一個padding的寬度,單位為dp,經過轉化為px後,用螢幕的寬度,減去左邊距,就是該item的實際寬度了,所以得出的值也是正確的


希望該程式碼對大家有所幫助!