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 &amp; 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;
}