[android] Android에서 ListView의 높이 제한

아래에 버튼을 표시하고 싶습니다 ListView. 문제는 ListView확장되면 (항목 추가 …) 버튼이 화면 밖으로 눌려진다는 것입니다.

LinearLayout가중치를 사용 하여 시도했지만 ( Android 에서 제안한대로 : View에 maxHeight가없는 이유는 무엇입니까? ) 가중치가 잘못되었거나 단순히 작동하지 않았습니다.

또한 어딘가에서 RelativeLayout. 은 ListView다음과 버튼 위에 설정됩니다 android:layout_abovePARAM.

이것의 문제는 나중에 버튼을 배치하는 방법을 모른다는 것입니다. 내가 찾은 예에서 아래의보기 ListView는를 사용하여 조정 android:layout_alignParentBottom되었지만 내 버튼이 화면 하단에 달라 붙는 것을 원하지 않습니다.

setHeight 메서드를 사용하고 필요한 공간을 계산하는 것 외에 다른 아이디어가 있습니까?


편집 :
유용한 답변이 많이 있습니다.

  • bigstone 및 user639183의 솔루션 은 거의 완벽하게 작동했습니다. 그러나 버튼 하단에 여백을 추가해야했습니다. 버튼이 여전히 화면에서 반쯤 밀려 나왔지만 중지되었습니다.

  • 상대 레이아웃에 대한 Adinia의 대답은 버튼을 화면 하단에 고정하려는 경우에만 좋습니다. 내가 의도 한 것은 아니지만 여전히 다른 사람들에게 유용 할 수 있습니다.

  • AngeloS의 솔루션은 내가 원하는 효과를 만들었 기 때문에 마지막에 선택한 솔루션이었습니다. 그러나 LinearLayout버튼 주변에 두 가지 사소한 변경을가했습니다 .

    • 내 레이아웃에있는 절대 값을 갖고 싶어하지 않았다 첫째, 나는 변화 android:layout_height="45px"wrap_content뿐만 아니라 잘 작동한다.

    • 둘째, vertical로만 지원되는 버튼이 수평 중앙에 위치하기를 원했기 때문에 LinearLayoutandroid : orientation = “horizontal”을 “vertical”로 변경했습니다.

    AngeloS는 또한 그의 초기 게시물 android:layout_weight="0.1"에서 LinearLayout주변의 매개 변수 ListView가 어떤 영향을 미쳤 는지 확실하지 않다고 말했습니다 . 나는 방금 시도했고 실제로 그렇습니다! 그렇지 않으면 버튼이 다시 화면 밖으로 밀려납니다.



답변

나는이 정확한 문제가 있었고 그것을 해결하기 위해 각각 및 각각 LinearLayouts을 수용 하기 위해 두 개의 분리 를 만들었습니다 . 거기에서 두 가지를 모두 넣고 해당 컨테이너 를 . 나는 또한의 무게 설정 을 보관 에를 하지만 어떤 효과가 있을지 모릅니다. 여기에서 버튼이있는 하단 컨테이너의 높이를 원하는 높이로 설정할 수 있습니다.ListViewButtonLinear Layoutandroid:orientationverticalLinearLayoutListView0.1

이것이 내가 의미하는 바를 편집 하십시오.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="0.1"
    android:orientation="horizontal">

    <ListView
        android:id="@+id/ListView01"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:dividerHeight="2px"></ListView>
</LinearLayout>

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="45px"
    android:background="@drawable/drawable"
    android:orientation="horizontal">

    <Button
        android:id="@+id/moreButton"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentRight="true"
        android:background="@drawable/btn_more2"
        android:paddingRight="20px" />

</LinearLayout>

위의 해결 방법은 화면 하단의 버튼을 수정합니다.


목록의 맨 아래에있는 버튼 플로트를하려면의 높이 변경 ListView01에를 wrap_content:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="0.1"
    android:orientation="horizontal">

    <ListView
        android:id="@+id/ListView01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:dividerHeight="2px"></ListView>
</LinearLayout>

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="45px"
    android:background="@drawable/drawable"
    android:orientation="horizontal">

    <Button
        android:id="@+id/moreButton"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentRight="true"
        android:background="@drawable/btn_more2"
        android:paddingRight="20px" />
</LinearLayout>


답변

코드에서이 문제를 해결하여 5 개 이상의 항목이있는 경우에만 listview의 높이를 설정했습니다.

if(adapter.getCount() > 5){
        View item = adapter.getView(0, null, listView);
        item.measure(0, 0);
        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, (int) (5.5 * item.getMeasuredHeight()));
        listView.setLayoutParams(params);
}

최대 높이를 단일 항목 높이의 5.5 배로 설정 했으므로 사용자는 스크롤해야 할 작업이 있음을 확실히 알 수 있습니다. 🙂


답변

마지막 편집 android:layout_above="@+id/butt1"에서 ListView 코드 도 추가하면 됩니다.

그리고 당신이 정말로 하나보다 더 사용할 필요가 없습니다 있음 (및 이전에 대한 답변을하려고 여기에 모든 사람을) 보여 RelativeLayout여기, 수정 된 코드 :

   <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/bkg">
    <TextView
        android:id="@+id/textView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="TextView1"
        android:layout_alignParentTop="true">
    </TextView>
    <TextView
        android:id="@+id/textView2"
        android:layout_below="@+id/textView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="TextView2"
        android:layout_centerHorizontal="true">
    </TextView>
    <Button
        android:id="@+id/butt1"
        android:text="string/string3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true">
    </Button>
    <ListView
        android:id="@+id/android:list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="2dip"
        android:layout_marginBottom="2dip"
        android:drawSelectorOnTop="false"
        android:visibility="visible"
        android:layout_below="@+id/textView2"
        android:layout_above="@+id/butt1" />
    </RelativeLayout>

그리고 그 결과 , 어떤 임의의 목록을 사용하여 :
여기에 이미지 설명 입력


답변

를 사용 LinearLayout하여 ListViewButton에 높이를 설정하고 wrap_content에 weight = 1을 추가합니다 ListView. 원하는대로 작동합니다.
그리고 예, 설정 layout_gravity의를 Buttonbottom


답변

AngeloS의 솔루션에서 영감을 얻은 중첩 컨테이너를 사용하지 않고이를 수행하는 방법을 찾았습니다.

나는 버튼 LinearLayout이있는 세로 방향 의 를 사용했습니다 ListView. 내가 설정 android:layout_weight="0.1"위해 ListView.

항상 목록의 맨 아래에 버튼 스틱을 가져옵니다. 그리고 목록이 커질 때 버튼이 화면에서 밀리지 않습니다.

<ListView
    android:id="@+id/notes_list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="0.1"
    />

<Button
    android:id="@+id/create_note_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="onCreateButtonClicked"
    android:text="@string/create_notes"
    />


답변

RelativeLayout 버튼이 바닥에 너무 가깝게 유지되는 것을 원하지 않는 경우 여백을 추가 할 수 있습니다 (버튼을 패딩하면 9 패치 배경을 사용하고 자체 패딩을 설정하기 때문에 버튼이 깨질 수 있음).

a를 사용한 경우에도 동일 LinearLayout합니다. 원하는 것을 달성하는 방법은을 ListViewheight = 0 및 weight = 1로 설정하고 button height = wrap_content 및 weight = 0으로 설정하는 것입니다. (user639183이 말했듯이 둘 다 wrap_content로 설정하면 ListView의 높이가 제한되지 않습니다 ).


답변

중첩 된 컨테이너를 사용하여이 작업을 수행 할 수 있습니다. 더 많은 공간을 차지하도록 두 번째 (내부) 컨테이너에 Button을 래핑하고 Button을 내부 컨테이너 상단에 정렬해야 할 수 있습니다.

다음과 같은 것이 가능합니다.

RelativeLayout

— 목록보기

-RelativeLayout

—- 버튼

두 컨테이너에서 서로 다른 정렬 옵션을 사용하면이 작업을 수행 할 수 있습니다.