0

我在 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 );
4

2 回答 2

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 );
于 2012-07-03T06:09:19.087 回答
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>

于 2014-08-16T15:26:45.783 回答