2015-02-06 4 views
0

ListView는 내용에 따라 높이가 다른 HorizontalScrollView에 래핑됩니다. 다음과 같이 목록 항목의 레이아웃은 다음과 같습니다 nextStopName 한 줄 경우안드로이드의 잘못된 높이 HorizontalScrollView로 감싸고 목록 항목의 높이가 다른 경우

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

모두 괜찮지 만,이 두 줄 바꿈 경우,리스트의 높이가 잘못 계산됩니다. DDMS에서 뷰 계층을 보면 ListView의 높이가 111 픽셀이지만 목록 항목을 둘러싸는 LinearLayout의 높이는 nextStopType 및 nextStopName을 포함하는 LinearLayout의 높이 인 122 픽셀입니다. 111은 실제로 nextStopCount 등을 포함하는 두 번째 LinearLayout의 높이입니다. al.

기본적으로 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가 있다는 것입니다. 그러나 HorizontalScroll View에 배치되거나 복잡한 항목 레이아웃이 아닙니다.

+0

이 문제를 조금 좁히거나이 문제를 재현하는 샘플 프로젝트를 게시 할 수 있다면 관심을 가질 수 있습니다. – corsair992

답변

0

당신은 새로운 LayoutParamsScrollView 높이와 getView()getView() 호출 할 때마다의 requestLayout() 방법의 크기를 조정해야합니다. 그 중 하나는 t의 크기는 해결했습니다 "돈 때

2 개 이상 AbsView은, 같은 시간에 각각-기타를 개최은`t.

+0

나는 이것을 잘 모르고있다. 우선 HorizontalScrollView는 AbstractLayout이며 AbstractListView가 아니므로 루트 레이아웃에 2 개의 "AbsViews"가 없습니다. 다른 레이아웃 매개 변수를 사용하여 getView 내부의 HorizontalScrollView에서 requestLayout을 호출하는 것이 좋습니다. 그렇다면 무엇을 제안합니까? 내가 잘못했을 수도 있습니다. 마음에 든 코드를 스케치하면 도움이 될 것입니다. – Andy

+0

세부 정보 : 명시된 바와 같이, ListVew의 높이가 올바르지 않습니다. 그 높이는 HorizontalScrollView의 높이에 전파됩니다. 목록의 항목 높이를 합계하여 ListView 높이를 계산 한 경우에도 계산 된 높이가 올바르지 않습니다 (111 픽셀). 보기와 같습니다.item에 대한 measure는 nextStopName이 랩핑되지 않은 것처럼 항목을 처리합니다. 올바른 높이 (122 픽셀)로 ListView에서 requestLayout을 호출하면 문제가 해결되지만 올바른 항목 높이를 얻는 방법은 무엇입니까? – Andy

+0

상품은 고정 된 크기 여야합니다. 또는 ListView 높이를 고정해야합니다. – GIGAMOLE

0

내가 다른 화면 크기에 대해 서로 다른 레이아웃을 사용하여 종료. 작은 화면의 경우 (기본) 레이아웃은 HorizontalScrollView를 사용하지만 목록 항목의 요소 너비는 위에서 제안한대로 고정 너비입니다. 큰 화면의 경우 HorizontalScrollView가없고 목록 항목 너비가 전체 화면이고 목록 항목 요소의 너비는

나는 HorizontalScrollView를 사용하기 위해해야 ​​할 일은 기존 레이아웃을 단일 선형 레이아웃을 사용하고 HorizontalScrollView에서 래핑하십시오. 위의 내용은 단순한 조언이 전체 이야기가 아닌 부분을 보여줍니다.

관련 문제