【发布时间】: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