0

我在我的屏幕中有一個listView。這個listView填充了我屏幕的2/3(所以它的高度因不同的設備而異)。我有 - 可以說在我的數組列表中有50個項目 - 但我需要在其中放置X個項目,這對用戶是可見的(例如,在小屏幕3上,在正常屏幕5上,在平板電腦8上)。Android#View.getHeight()不返回正確的值

所以我在做的方式是在PX中獲取listView的高度,然後得到它的DP尺寸,因爲我知道每行的高度是60dp,然後將DP格式的listViwe的高度除以行的高度60dp)。因此,它會返回用戶可見的項目數量,並將此數字傳遞給我的適配器的getCount()方法以填充此數量的項目。

這是我的代碼,我有一個將被分配一些地方在onCreate()方法這樣this.mListView.getViewTreeObserver().addOnGlobalLayoutListener(mListViewGlobalListener);

 ViewTreeObserver.OnGlobalLayoutListener mListViewGlobalListener = new ViewTreeObserver.OnGlobalLayoutListener() 
     { 
      @Override 
      public void onGlobalLayout() 
      { 
       removeListViewListener(); 

       if (mListView == null || mAdapter == null) 
       { 
        return; 
       } 

       int heightInPx = mListView.getHeight(); 
       int heightInDp = pixelsToDp(heightInPx, getResources().getDisplayMetrics()); 
       int maxDisplayDriver = heightInDp/60; 
       mAdapter.setMaxDisplayDrivers(maxDisplayDriver); 
       Logger.error("TEST", "heightInPx:" + heightInPx + ", heightInDp:" + heightInDp + ", maxDisplayDriver:" + maxDisplayDriver); 
      } 
     }; 

    public static int pixelsToDp(int px, DisplayMetrics metrics) 
    { 
      return (int) (px/metrics.density); 
    } 

觀察員現在,當我運行的應用程序,我有以下日誌:E/TEST: heightInPx:96, heightInDp:32, maxDisplayDriver:0

我相信高度是錯誤的,因爲我可以在屏幕上放置至少4個項目,這將是240dp,而日誌顯示其他內容。任何想法將不勝感激。謝謝。

+0

你試過'mListView.getLayoutParams()。height'代替了嗎? – BNK

+0

@BNK,謝謝你更糟。日誌顯示'E/TEST:heightInPx:-2,heightInDp:0,maxDisplayDriver:0' – Hesam

+0

對不起,希望以下鏈接對你有所幫助http://stackoverflow.com/questions/15039913/android-how -to-measure-total-height-of-listview – BNK

回答

0

您可以通過這種方式獲得listview的高度,因爲listview可以有n個孩子,getHeight()返回實際高度而不是當前可見部分的高度。所以對於listview和其他類似的視圖,它不會返回高度,因爲即使系統不知道,因爲所有的子項都還沒有渲染。因此,正如其他極客們所建議的那樣,您需要計算item + margin + padding(如果有)的高度,然後將其乘以子數(您怎麼知道這一點?請提前閱讀)。 現在孩子的數量在不同的屏幕尺寸上會有所不同。所以你需要在getView裏面加一個計數器來檢查它被調用的次數是多少次以瞭解子項的數量

+0

如果listView設置爲wrapcontent,那麼你就是從高度開始的,那麼它第一次不知道確切的時間。這種方式並不適合我,所以選擇了另一種方法來解決我的問題。感謝你的回答。 – Hesam

+0

很酷,你找到了解決這個問題的另一種方法。請注意,這樣可以幫助其他人在更短的時間內立即找到答案。 :) –