尝试以我想要的方式获得布局。它包含一个ListView和一个包含两个TextView的LinearLayout。
问题是如果ListView有更多项目然后放在一个屏幕上,则ListView会占用整个屏幕。在这种情况下,它不会在其下方显示视图。
如果我使用layout_height = 0dp将ListView设置为layout_weight = 1,则其下方的View将一直显示到底部,因为如果没有足够的项目,ListView将填满屏幕。
那么如何直接在其下方获取带有View的ListView,所以不将其设置在屏幕的底部?
根据要求(但如果列表视图不适合一个屏幕,则无法查看列表视图下方的视图):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<ListView
android:id="@+id/list_bookings"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" />
<LinearLayout
android:id="@+id/expected_cost_linearLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/padding_regular">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:text="@string/expected_cost_label"
android:textStyle="bold" />
<TextView
android:id="@+id/expected_cost_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="..."
android:focusable="false" />
</LinearLayout>
</LinearLayout>
答案 0 :(得分:1)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<ListView
android:id="@+id/list_bookings"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimaryDark"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="50dp" />
<LinearLayout
android:id="@+id/expected_cost_linearLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:text="expected_cost_label"
android:textStyle="bold" />
<TextView
android:id="@+id/expected_cost_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="..."
android:focusable="false" />
</LinearLayout>
</RelativeLayout>
更新的答案
使用此布局文件
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
xmlns:android="http://schemas.android.com/apk/res/android" >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<ListView
android:id="@+id/list_bookings"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimaryDark"
android:layout_gravity="center_horizontal"
/>
<LinearLayout
android:id="@+id/expected_cost_linearLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:text="expected_cost_label"
android:textStyle="bold" />
<TextView
android:id="@+id/expected_cost_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="..."
android:focusable="false" />
</LinearLayout>
</LinearLayout>
</ScrollView>
//在你的布局文件中 将适配器设置为listview后调用此方法。此代码取自 https://stackoverflow.com/a/19311197/2793134
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null)
return;
int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.UNSPECIFIED);
int totalHeight = 0;
View view = null;
for (int i = 0; i < listAdapter.getCount(); i++) {
view = listAdapter.getView(i, view, listView);
if (i == 0)
view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, AbsListView.LayoutParams.WRAP_CONTENT));
view.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
totalHeight += view.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
希望这会有所帮助。干杯
答案 1 :(得分:0)
我觉得太复杂了。我最终创建了一个ListItem,可以使用我想要的布局进入适配器。这样它就成了ListView的一部分,它的位置可以控制在底部。因为它是ListView的一部分所以它不会被ListView混淆,就像ListView在物品太多时获得的视图一样。