我的屏幕上有一个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的项目,而日志显示其他内容。任何想法将不胜感激。感谢。
答案 0 :(得分:0)
您可以通过这种方式获得listview的高度,因为listview可以有n
个子项,getHeight()
返回实际高度而不是当前可见部分的高度。因此对于listview和其他类似视图,它不会返回高度,因为即使系统不知道,因为所有子项目都尚未呈现。
正如其他极客所建议的那样,你需要计算item + margin + padding(如果有的话)的高度,然后将它乘以child的数量(你怎么知道这个?预读)。
现在,不同屏幕尺寸的孩子数量会有所不同。因此,您需要在getView
内放置一个计数器来检查它被调用onCreate的次数以了解子项目的数量