【问题标题】:Android #View.getHeight() doesn't return correct valueAndroid #View.getHeight() 没有返回正确的值
【发布时间】:2016-04-21 17:44:48
【问题描述】:

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

所以我正在做的方法是在 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 的项目,而日志显示其他内容。

【问题讨论】:

  • 你试过mListView.getLayoutParams().height吗?
  • @BNK,谢谢,这更糟。日志显示E/TEST: heightInPx:-2, heightInDp:0, maxDisplayDriver:0
  • 抱歉 :),希望以下链接对您有所帮助stackoverflow.com/questions/15039913/…
  • @BNK,感谢您的帮助。有趣的是,他正在根据适配器的项目数计算高度。但我需要先知道高度是多少,然后要求适配器在其中填充该高度。
  • getLayoutParams().height = -2 表示设置为 WRAP_CONTENT

标签: android listview android-listview android-viewtreeobserver


【解决方案1】:

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

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

【讨论】:

  • 如果 listView 已设置为 wrapcontent ,那么从高度开始你是对的,那么第一次它不知道确切的时间。这种方法对我不起作用,所以选择了另一种方法来解决我的问题。感谢您的回答。
  • 很酷,您找到了解决此问题的另一种方法。请投票,以便其他人在更短的时间内立即识别出这个答案。 :)
猜你喜欢
  • 2018-04-22
  • 2014-11-26
  • 2019-03-21
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多