計算ListView的高度終極版,考慮到多行textview的情況
阿新 • • 發佈:2018-12-06
在一些時候,我們需要計算Listview的情況,一般來說,網上的許多程式碼都可以完成計算高度,但是如果遇到textview多行的情況,往往發現計算就不準確了,我找了網上一些方案,結合自己的實驗,給出一套最終的解決方案,希望對大家有所幫助
[java] view plain copy
- private int getListviewHeight(ListView pull) {
- ListAdapter listAdapter = pull.getAdapter();
- if (listAdapter == null) {
- return
- }
- DisplayMetrics dm =getResources().getDisplayMetrics();
- int w_screen = dm.widthPixels;
- int totalHeight = 0;
- int listViewWidth = w_screen-dip2px(this,16); //listView在佈局時的寬度
- int widthSpec = View.MeasureSpec.makeMeasureSpec(listViewWidth, View.MeasureSpec.AT_MOST);
- for (int i = 0; i < listAdapter.getCount(); i++) {
- View listItem = listAdapter.getView(i, null, pull);
- listItem.measure(widthSpec, 0);
- int itemHeight = listItem.getMeasuredHeight();
- totalHeight += itemHeight;
- }
- // 減掉底部分割線的高度
- int historyHeight = totalHeight
- + (pull.getDividerHeight() * listAdapter.getCount() - 1);
- return historyHeight;
- }
[java] view plain copy
- public static int dip2px(Context context, float dipValue){
- final float scale = context.getResources().getDisplayMetrics().density;
- return (int)(dipValue * scale + 0.5f);
- }
經過筆者驗證,無論textview多少行,計算出來的高度是正確的,與網上許多程式碼不同的地方,就是
[java] view plain copy
- listItem.measure(widthSpec, 0);
這個函式實現傳入的第一個引數就是listview中,每一項item的實際寬度,所以上面的程式碼有一句是
[java] view plain copy
- int listViewWidth = w_screen-dip2px(this,16);
希望該程式碼對大家有所幫助!