1

我正在计算ListView中某些项目的高度,然后以编程方式将计算出的高度分配给ListView,以确保ListView将展开以适应其内容。我计算了ListView中项目的高度,如下面的代码所示。关于理解布局单元

如该代码所示,下面的行返回等于533的值:

height += listView.getDividerHeight() * listView.getCount();// 

我的问题是,当ListView中的高度设定为返回值“533”,如图在代码中,ListView与它的内容具有完全相同的高度。但是,当我把整个相同的值“533”到ListView :XML文件中的“Android layout_height”,然后ListView的扩展太大超出其内容

“比它的内容更高”所以我的问题是:

  1. 请解释为什么发生这种情况?

  2. 至于发布的代码,当我将'TypedValue.COMPLEX_UNIT_DIP'更改为'TypedValue.COMPLEX_UNIT_PX'之类的任何其他单元时,根本没有任何变化。为什么在更改LayoutParameter的单位时没有效果?

代码

int height = 0; 
for (int i = 0; i < listView.getCount(); i++) { 
    View childView = listView.getAdapter().getView(i, null, listView); 
    childView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 
    height+= childView.getMeasuredHeight(); 
} 
//dividers height 
height += listView.getDividerHeight() * listView.getCount();// returns 533 

param = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, height, this.getResources().getDisplayMetrics())); 
param.addRule(RelativeLayout.BELOW, ruleSubject); 
container.setLayoutParams(param); 
listView.requestLayout(); 

回答

0

1,请解释为什么会是怎么回事?

in .xml布局文件,您正在使用dp中的值。与计算值533 533px。所以在布局XML文件中使用

android:layout_height="533px" 

你会得到相同的结果。

+0

fine..but当我转换的计算值 “522” 新闻部获得266 ......当我编程方式设置claculated DP值,如图代码..我得到一个非常小的listview高度,即使我以编程方式在代码中指定了正确的单位 – user2121

+0

以编程方式您必须在px.convert中将值赋给px.您将得到相同的结果。以上回答 –

+0

我觉得你的转换是错误的。检查最后的答案。它可以帮助! –

0

首先,你需要阅读关于尺寸here。它说

将dp单位转换为屏幕像素很简单:px = dp *(dpi/160)。例如,在240 dpi屏幕上,1 dp等于1.5个物理像素。定义应用程序的用户界面时,应始终使用dp单位,以确保在不同密度的屏幕上正确显示您的用户界面。

1-请解释为什么会发生这种情况?

那是因为如何渲染这些像素。当你用XML来完成时,它是静态地呈现,当你用Java做它时,它是动态呈现。

0

2 - 对于发布的代码,当我将'TypedValue.COMPLEX_UNIT_DIP'更改为'TypedValue.COMPLEX_UNIT_PX'之类的任何其他单元时,根本没有任何变化。为什么没有改变布局单元的效果参数

ans:返回值将在px中。

enter image description here

enter image description here

enter image description here