2013-08-02 50 views
1

我需要在運行時獲得準確的listView高度。如何在運行時獲得準確的ListView高度?

當我使用下面的代碼時,每個listItem的高度不正確。

  int totalHeight = 0; 
      for (int i = 0; i < listAdapter.getCount(); i++) { 
       View listItem = listAdapter.getView(i, null, listview); 
       listItem.measure(0, 0); 
       totalHeight += listItem.getMeasuredHeight(); 
      } 
      params.height = totalHeight + listview.getDividerHeight()* (listAdapter.getCount() -1); 
      listview.setLayoutParams(params); 
      listview.requestLayout(); 

當我使用getChild版本,身高是準確的,但總數是關閉...

 int total = 0; 
     for (int i = 0; i < listview.getChildCount(); i++) { 
      View childAt = listview.getChildAt(i); 
      if (childAt == null) 
       continue; 

      int childH = childAt.getMeasuredHeight(); 
      total += childH; 
     } 
     int div = listview.getDividerHeight(); 
     total += (div * (listAdapter.getCount() - 1)); 

     if (params.height != total) { 
      getLogger().info("setting measured buttons list to height: " + total); 
      params.height = total; 
      listview.requestLayout(); 
      ViewParent parent = listview.getParent(); 

你有沒有遇到這個問題?

回答

0

使用此,我現在使用它,它工作100%,我用它來使scrollview包含一個列表。

package com.emercs.android.easyihome.util; 

import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListAdapter; 
import android.widget.ListView; 

public class Helper { 

public static void getListViewSize(ListView myListView) { 
    ListAdapter myListAdapter = myListView.getAdapter(); 
    if (myListAdapter == null) { 
     // do nothing return null 
     return; 
    } 
    // set listAdapter in loop for getting final size 
    int totalHeight = 0; 
    for (int size = 0; size < myListAdapter.getCount(); size++) { 
     View listItem = myListAdapter.getView(size, null, myListView); 
     if (listItem != null) { 
      listItem.measure(0, 0); 
      totalHeight += listItem.getMeasuredHeight(); 
     } 
    } 
    // setting listview item in adapter 
    ViewGroup.LayoutParams params = myListView.getLayoutParams(); 
    if (params != null) { 
     params.height = totalHeight 
       + (myListView.getDividerHeight() * (myListAdapter 
         .getCount() - 1)); 

     myListView.setLayoutParams(params); 
     // print height of adapter on log 
    } 
} 
} 

檢查並添加到ListView控件

ScrollView scrollViewScenes = (ScrollView) findViewById(R.id.x); 

    if (scrollViewScenes != null) { 
     Helper.getListViewSize(listview); 
    } 

希望這有助於。

+0

什麼是在'ScrollView'使用'ListView'如果你要顯示它的點完成與其所有的孩子一起? – Luksprog

+0

如果您有3個ListView,每個listview有30個項目,您如何看待所有列表?相信我這是一個很大的方式來找到listview的高度,也有助於惠特問題,我之前提到 –

2

listItem.measure(0,0);措施0,0使用第一參數MeasureSpec.makeMeasureSpec(listWidth,MeasureSpec.EXACTLY)和第二參數MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED))的參數遵循這個代碼

公共靜態無效getTotalHeightofListView(ListView中的ListView) {

ListAdapter mAdapter = listView.getAdapter(); 

    int totalHeight = 0; 
    int listWidth = listView.getMeasuredWidth(); 

    for (int i = 0; i < mAdapter.getCount(); i++) { 
     View mView = mAdapter.getView(i, null, listView); 

     mView.measure(
       MeasureSpec.makeMeasureSpec(listWidth, MeasureSpec.EXACTLY), 

       MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 

     totalHeight += mView.getMeasuredHeight(); 
     Log.w("HEIGHT" + i, String.valueOf(totalHeight)); 

    } 

    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = totalHeight 
      + (listView.getDividerHeight() * (mAdapter.getCount() - 1)); 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 

} 
+0

我正在寫相同的代碼。它的工作,但我的問題是在我的列表視圖每個視圖高度是差異。並在此代碼中每個視圖高度是相同的回報,這就是爲什麼最後一個項目的列表不顯示,即完整的listview不顯示.. – SAndroidD

+0

請張貼您的代碼 –

+0

檢查此鏈接這裏是我的問題http://stackoverflow.com/questions/ 25197133/how-to-calculate-listview-height-of-different-height-listitem-in-android – SAndroidD

8

如果你只是想找到listView的高度,您可以使用

listView.post(new Runnable() 
{ 
    public void run() 
    { 
     listView.getHeight(); 
    } 
}); 
+1

偉大的解決方案...謝謝! – Adrian

+0

這可行,但我不明白爲什麼。你能解釋爲什麼在UI線程上發佈'listView.getHeight()'爲什麼會給出所需的結果,但是在'onViewCreated'中簡單地使用'listView.getHeight()'本身返回0? –

+0

如果在'onViewCreated'中使用'listView.getHeight()',則不能保證'listView'已經被繪製完成。如果你按照我在這裏顯示的方式調用它,那麼一旦「listView」被繪製出來,它就會被調用,這樣你就可以獲得正確的高度。 – Apoorv