2015-02-06 50 views
0

我有一个ListView包装在Horizo​​ntalScrollView中,其中列表项视图根据内容具有不同的高度。列表项的布局如下:Horizo​​ntalScrollView中包含的Android Listview的高度不正确,其中列表项的高度不同

<?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> 

一切都很好,如果nextStopName是单行线,但是如果换到两行,列表的高度失算。如果我查看DDMS中的视图层次结构,则ListView的高度为111像素,但包含列表项的LinearLayout的高度为122像素,即LinearLayout的高度,该高度包围nextStopType和nextStopName。 111实际上是包含nextStopCount等的第二个LinearLayout的高度。人。

基本上,每当nextStopName包装,我得到这个错误。

下面是一个可以看到效果的屏幕截图。

Screen shot of truncated list item 下面是这个屏幕的布局。

<?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; 
} 

我已经尝试了布局上的众多变体,所有结果都一样。奇怪的是,应用程序中还有其他ListView,它们具有不同高度的项目,并且它们可以很好地工作,但它们既不包含在Horizo​​ntalScroll视图中,也不具有复杂的项目布局。

+0

如果你可以缩小这个问题的范围,并且/或者发布一个重现此项目的示例项目,我会感兴趣。 – corsair992 2015-02-09 05:52:51

回答

0

您必须调整ScrollView高度与新LayoutParams,并在每时getView()被调用时getView()requestLayout()方法。

2以上AbsView`吨保持每个-其他在同一时间,当它们中的一个不要“吨具有固定的大小。

+0

我不知道我明白这一点。首先,Horizo​​ntalScrollView是一个FrameLayout而不是AbstractListView,所以在根布局中没有2个“AbsViews”。你是否建议在具有不同布局参数的getView的Horizo​​ntalScrollView上调用requestLayout,如果是这样,你有什么建议?我可能弄错了,如果你勾画出你想要的代码,可能会有所帮助。 – Andy 2015-02-08 01:17:03

+0

更多细节:如上所述,ListVew的高度不正确。该高度传播到Horizo​​ntalScrollView的高度。即使通过计算列表中项目的高度来计算ListView的高度,计算出的高度也不正确(111像素)。就好像View一样。如果nextStopName未包装,则对该项目进行的处理就是处理该项目。使用正确的高度(122像素)在ListView上调用requestLayout可以解决问题,但是如何获得正确的项目高度? – Andy 2015-02-08 20:23:11

+0

您的物品必须有固定尺寸。或者你的ListView必须被修复。 – GIGAMOLE 2015-02-08 20:33:08

0

我结束了使用不同的布局对于不同的屏幕尺寸。对于小屏幕(缺省)布局使用Horizo​​ntalScrollView,但列表项的元素宽度具有固定的宽度,如上所示。对于较大的屏幕,没有Horizo​​ntalScrollView,列表项宽度是全屏幕,列表项元素的宽度是由权重决定。作品像一个魅力

我被带入歧途的建议,所有你必须做的使用Horizo​​ntalScrollView包装现有的布局在一个单线性布局并将其包装在Horizo​​ntalScrollView中。以上只是说明了这样简单的建议不完全是什么。