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

问题描述 投票:0回答:1

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

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

android listview android-listview android-viewtreeobserver
1个回答
0
投票

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

同样,根据其他极客的建议,您需要计算项目的高度+边距+填充(如果有),然后将其乘以子代的数量(您怎么知道的?请继续阅读)。现在,在不同的屏幕尺寸下,孩子的数量将有所不同。因此,您需要在getView内放置一个计数器,以检查其调用onCreate的次数以了解子项的数量

© www.soinside.com 2019 - 2024. All rights reserved.