HorizontalScrollView中包装的Android Listview的高度不正确,其中列表项具有不同的高度
我将列表视图包装在水平滚动视图中,其中列表项视图根据内容具有不同的高度。列表项布局如下所示:HorizontalScrollView中包装的Android Listview的高度不正确,其中列表项具有不同的高度,android,listview,android-listview,row-height,Android,Listview,Android Listview,Row Height,我将列表视图包装在水平滚动视图中,其中列表项视图根据内容具有不同的高度。列表项布局如下所示: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content"
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:baselineAligned="false"
android:orientation="horizontal"
android:weightSum="1" >
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".5"
android:minHeight="50dp"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/nextStopType"
android:layout_width="20dp"
android:layout_height="wrap_content"
android:gravity="center"
android:text="P"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@color/dohrn_orange" />
<TextView
android:id="@+id/nextStopName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:maxLines="2"
android:text="Customer Name"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
<TextView
android:id="@+id/nextstopAddress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minLines="2"
android:paddingLeft="20dp"
android:text="Address"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".3"
android:orientation="vertical" >
<TextView
android:id="@+id/nextStopCount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minWidth="@dimen/nextStopDetailsWidth"
android:text="Stop Count"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:id="@+id/nextStopTimes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="?android:attr/textAppearanceSmall"
android:text="Open/Close Times"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:id="@+id/nextStopContact"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Contact Number"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_weight=".2"
android:gravity="right" >
<TextView
android:id="@+id/nextStopPieces"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="right"
android:minWidth="@dimen/nextStopPiecesWidth"
android:text="HUs"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:id="@+id/nextStopWeight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="right"
android:minWidth="@dimen/nextStopWeightWidth"
android:text="Weight"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
</LinearLayout>
我尝试了许多不同的布局,都得到了相同的结果。奇怪的是,该应用程序中还有其他列表视图,它们具有不同高度的项目,并且工作正常,但它们既没有包装在水平滚动视图中,也没有复杂的项目布局。您必须使用新的
布局参数和请求布局()调整滚动视图的大小每次调用getView()
时,getView()中的方法
两个或多个AbsView
无法同时容纳彼此,因为其中一个没有固定的大小。我最终使用了不同的布局以适应不同的屏幕大小。对于小屏幕(默认)布局使用水平滚动视图,但列表项元素的宽度具有上述建议的固定宽度。对于更大的屏幕,没有水平滚动视图,列表项宽度为全屏,列表项元素的宽度由权重决定。效果很好
有人建议说,使用HorizontalScrollView只需将现有布局包装成一个线性布局,然后再包装成HorizontalScrollView,这让我误入歧途。以上只是说明了这样简单的建议并不是全部内容。我不确定我是否理解这一点。首先,HorizontalScrollView是FrameLayout,而不是AbstractListView,因此没有2个“AbsView”“在根布局中。您是否建议使用不同的布局参数在getView内部的HorizontalScrollView上调用requestLayout,如果是,您有什么建议?我可能弄错了,如果你把你想的代码画出来可能会有帮助。更多细节:如上所述,ListVew的高度是不正确的。该高度将传播到水平滚动视图的高度。即使通过对列表中项目的高度求和来计算ListView的高度,计算的高度也不正确(111像素)。这就好像项目上的View.measure将项目视为未包装nextStopName。使用正确的高度(122像素)在ListView上调用requestLayout可以解决问题,但是如何获得正确的项目高度?您的项目必须具有固定的大小。或者你的ListView高度必须是固定的。是的,我试过了,当然它解决了问题。问题是:“为什么包含nextStopName的TextView上的View.measure会返回高度,就好像nextStopName是一行一样?”但在绘制TextView时,它必须知道宽度,并正确推断nextStopName必须被包装。因此,测量阶段得到一个答案,绘图阶段得到另一个答案。真奇怪。就这个应用程序而言,我将不得不为列表项使用两种布局,一种用于窄屏幕,另一种用于宽屏幕。如果您可以将这个问题缩小一点,和/或发布一个复制此内容的示例项目,我将感兴趣。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<HorizontalScrollView
android:layout_width="fill_parent"
android:layout_height="0dp"
android:fillViewport="true"
android:layout_weight="1" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".5"
android:gravity="center_vertical"
android:maxLines="2"
android:minWidth="@dimen/nextStopAddressWidth"
android:text="Customer Name & Address"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".3"
android:hint="?android:attr/textAppearanceMedium"
android:minWidth="@dimen/nextStopDetailsWidth"
android:text="Details"
android:textAppearance="?android:attr/textAppearanceMedium" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight=".2"
android:gravity="right" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="right"
android:minWidth="@dimen/nextStopPiecesWidth"
android:text="HUs"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="right"
android:minWidth="@dimen/nextStopWeightWidth"
android:text="Weight"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
</LinearLayout>
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" >
</ListView>
</LinearLayout>
</HorizontalScrollView>
<LinearLayout
android:id="@android:id/empty"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/eolMargin"
android:gravity="center"
android:text="Waiting For Stops"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Button
android:id="@+id/logoutButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/eolMargin"
android:text="Logout"
android:textAppearance="?android:attr/textAppearanceButton" />
</LinearLayout>
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(rowLayout, parent, false);
}
StopItem stopItem = getItem(position);
TextView pdFlag = (TextView) row.findViewById(R.id.nextStopType);
pdFlag.setText(stopItem.getType());
if (isCurrentDestination(stopItem)) {
pdFlag.setTextColor(Color.GREEN);
} else {
pdFlag.setTextColor(DOHRN_ORANGE);
}
TextView name = (TextView) row.findViewById(R.id.nextStopName);
name.setText(stopItem.getCustomerName());
TextView address = (TextView) row.findViewById(R.id.nextstopAddress);
address.setText(stopItem.getAddress());
TextView stopCount = (TextView)row.findViewById(R.id.nextStopCount);
stopCount.setText(stopItem.getStopCount() );
TextView timesView = (TextView)row.findViewById(R.id.nextStopTimes);
String times = stopItem.getTimes("\n");
if (times.length() == 0) {
timesView.setVisibility(View.GONE);
} else {
timesView.setText(times);
}
TextView phoneView = (TextView)row.findViewById(R.id.nextStopContact);
String phoneNumber = stopItem.getFormattedPhoneNumber();
if (phoneNumber.length() == 0) {
phoneView.setVisibility(View.GONE);
} else {
phoneView.setText(phoneNumber);
}
TextView pieceCount = (TextView)row.findViewById(R.id.nextStopPieces);
pieceCount.setText(stopItem.getPieceCount());
TextView weight = (TextView)row.findViewById(R.id.nextStopWeight);
weight.setText(stopItem.getWeight());
return row;
}