2013-08-02 49 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