Android#View.getHeight()没有返回正确的值

时间:2016-01-16 02:11:49

标签: android listview android-listview android-viewtreeobserver

我的屏幕上有一个listView。此listView填充了我的屏幕的2/3(因此它的高度因设备而异)。我有 - 让我的数组列表中有50个项目 - 但是我需要在其中放置X个项目,这对用户是可见的(例如在小屏幕3上,在正常屏幕5上,在平板电脑8上)。

所以我正在做的方法是在PX中获取listView的高度,然后得到它的DP大小,因为我知道每行的高度是60dp然后将DP格式的listViwe的高度除以行的高度(其中60dp)。因此,它返回用户可见的项目数,并将此数字传递给我的适配器的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

现在,当我运行应用程序时,我有以下日志: .field("tenantId, "075841cb-d7fa-4890-84ea-fdd7d7c65b65")

我认为高度是错误的,因为我可以在屏幕上放置至少4个240dp的项目,而日志显示其他内容。任何想法将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

您可以通过这种方式获得listview的高度,因为listview可以有n个子项,getHeight()返回实际高度而不是当前可见部分的高度。因此对于listview和其他类似视图,它不会返回高度,因为即使系统不知道,因为所有子项目都尚未呈现。

正如其他极客所建议的那样,你需要计算item + margin + padding(如果有的话)的高度,然后将它乘以child的数量(你怎么知道这个?预读)。 现在,不同屏幕尺寸的孩子数量会有所不同。因此,您需要在getView内放置一个计数器来检查它被调用onCreate的次数以了解子项目的数量