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

很酷,你找到了解决这个问题的另一种方法。请注意,这样可以帮助其他人在更短的时间内立即找到答案。 :) –