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

Android #View.getHeight() doesn't return correct value

我的屏幕上有一个 listView。这个 listView 占据了我屏幕的 2/3(因此它的高度在不同的设备上有所不同)。我有 - 可以说我的数组列表中有 50 个项目 - 但我需要在其中放置 X 个用户可见的项目(例如,在小屏幕 3 上,在普通屏幕 5 上,在平板电脑 8 上)。

所以我正在做的是在 PX 中获取 listView 的高度,然后获取它的 DP 大小,因为我知道每行的高度是 60dp 然后将 DP 格式的 listViwe 的高度除以行的高度(哪个 60dp)。所以它 returns 用户可见的项目数量,我将这个数字传递给我的适配器的 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 的项目,而日志显示其他内容。

您可以通过这种方式获取列表视图的高度,因为列表视图可以有 n 个 child 和 getHeight() return 个实际高度而不是高度当前可见部分。因此,对于列表视图和其他类似视图,它没有 return 高度,甚至系统也不知道,因为所有 child 项目尚未呈现。

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

的数量