ListView高度android

时间:2012-07-02 18:51:24

标签: android listview

我在FrameLayout中有一个FrameLayout和一个Listview。 我用另一个布局填充Listview。 问题是如果我将layout_height设置为wrap_content,我的getview将被多次调用为单个记录,如果我将layout_height设置为fill_parent或wrap_content,则我的getview将被调用3次单个记录。如果我将layout_height设置为某个dp值,它可以正常工作。我的意思是我没有任何性能问题,我的getview只被调用一次记录。 所以我使用

以编程方式获得屏幕高度和宽度
Display display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int width = display.getWidth(); 
int height = display.getHeight();

但是如果我使用上面的代码设置Listview的宽度和高度,我的Listview的最后一条记录部分不可见。 我想这应该是因为获得的屏幕高度包括标题栏高度,状态栏高度和通知栏高度。

所以,如果那是问题,有人可以帮助我计算可用的屏幕高度吗?那是屏幕高度 - 标题栏高度 - 状态栏高度 - 通知栏高度? 别的什么问题?为什么我的ListView中的最后一条记录不完全可见?

XML文件

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/listview"
android:background="#ffffff"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<ListView android:id="@+id/android:list"
android:background="#ffffff"    
android:layout_weight="1"
android:layout_width="fill_parent"
android:layout_height="300dp"
android:clickable="true"
android:fastScrollEnabled="true"   
android:smoothScrollbar="true"    
/>
</FrameLayout>

然后我在我的java代码中将列表视图的layout_height和layout_width设置为

Display display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int width = display.getWidth(); 
int height = display.getHeight();
FrameLayout.LayoutParams parameters = new FrameLayout.LayoutParams((int)(width),(int)(height));
ListView listview=(ListView) getListView();
listview.setLayoutParams(parameters );

2 个答案:

答案 0 :(得分:0)

非常感谢您的帮助 我改变了我的代码如下,现在它的工作:)

Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height=0;
int width = display.getWidth(); 
switch (metrics.densityDpi) 
{ 
case DisplayMetrics.DENSITY_HIGH:
height = display.getHeight() - (48*2);
break;
case DisplayMetrics.DENSITY_MEDIUM:
height = display.getHeight() - (32*2);                              
break;
case DisplayMetrics.DENSITY_LOW:
height = display.getHeight() - (24*2);
break;
default:
height = display.getHeight() - (48*2);
}
FrameLayout.LayoutParams parameters = new FrameLayout.LayoutParams((int)(width),(int)(height));
ListView listview=(ListView) getListView();
listview.setLayoutParams(parameters );

答案 1 :(得分:0)

在java中:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int s_width,s_height;
s_width = metrics.widthPixels;
s_height = metrics.heightPixels/3;
TableRow.LayoutParams parameters = new TableRow.LayoutParams(s_width,s_height);
LinearLayout b_list_table=(LinearLayout) findViewById(R.id.b_list_table);
b_list_table.setLayoutParams(parameters);
xml中的

<?xml version="1.0" encoding="utf-8"?>
   <RelativeLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   >

   <LinearLayout
       android:orientation="vertical"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_alignParentBottom="false"
       >






       <TableRow
           android:layout_width="match_parent"
           android:layout_height="180dip"
           android:id="@+id/b_list_table"
           >
           <ListView android:id="@+id/list"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:layout_weight="1"
               android:drawSelectorOnTop="false"/>
       </TableRow>






       <TableRow
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           >
           <ListView android:id="@+id/listf"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"

               android:layout_weight="1"
               android:drawSelectorOnTop="false"/>
       </TableRow>

   </LinearLayout>