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이 래핑 될 때마다이 오류가 발생합니다.
다음은 효과를 볼 수있는 스크린 샷입니다.
다음은이 화면의 레이아웃입니다.
<?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;
}
나는 동일한 결과로 레이아웃에 많은 변형을 시도했다. 이상한 점은 앱에 다른 높이를 가진 항목이 있고 잘 작동한다는 ListView가 있다는 것입니다. 그러나 HorizontalScroll View에 배치되거나 복잡한 항목 레이아웃이 아닙니다.
이 문제를 조금 좁히거나이 문제를 재현하는 샘플 프로젝트를 게시 할 수 있다면 관심을 가질 수 있습니다. – corsair992