IT story

Android에서 ListView의 높이 제한

hot-time 2020. 9. 9. 20:16
반응형

Android에서 ListView의 높이 제한


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

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

또한 어딘가에서 RelativeLayout. 그러면 매개 변수가 ListView있는 버튼 android:layout_above위에이 설정됩니다.

이것의 문제는 나중에 버튼을 배치하는 방법을 모른다는 것입니다. 내가 찾은 예에서 아래의보기 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:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.1"
        >   



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



    </LinearLayout> 

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


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

</LinearLayout>
</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:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.1"
        >   

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



    </LinearLayout> 

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


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

</LinearLayout>
</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


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

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


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"
    />

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

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

RelativeLayout

-- 목록보기

-RelativeLayout

---- 버튼

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


이것이 가장 깨끗한 방법입니다.

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
  <ListView
      android:id="@+id/ListView01"
      android:layout_width="fill_parent"
      android:layout_height="0dp"
      android:layout_weight="1"
      android:dividerHeight="2px">
  </ListView>
  <FrameLayout
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:background="@drawable/drawable"
      >
    <Button android:background="@drawable/btn_more2"
        android:id="@+id/moreButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:paddingRight="20px"
        />    
  </LinearLayout>
</LinearLayout>

Angelos의 솔루션과 유사하지만 ListView를 래핑하는 선형 레이아웃이 필요하지 않습니다. 또한 LinearLayout에 비해 더 가벼운 FrameLayout을 사용하여 Button을 래핑 할 수 있습니다.


아이디어는 다음과 같은 매우 좋은 솔루션에 설명되어 있습니다.

둘 다 v4.4.3 이상에서 완벽하게 작동하는 것 같습니다.

나는 그것을 확인하고 각 방법을 확인하기 위해 여전히 테스트 코드를 작성하는 데 약간의 시간을 소비해야했다. 아래는 필요한 자체 포함 최소 테스트 코드입니다.


레이아웃은 중첩 된 레이아웃이 더 적기 때문에 Sparkle의 솔루션을 기반으로합니다. 또한 현재 LINT 검사를 반영하도록 업데이트되었습니다.

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

    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <Button
        android:id="@+id/btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Grow List"
        tools:ignore="HardcodedText" />

</LinearLayout>

활동은 솔루션을 직접 테스트 할 수있는 상용구 코드를 제공합니다.

public class MainActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ListView listview = (ListView)findViewById(R.id.listview);
        final ArrayAdapter<String> adapter = 
                new ArrayAdapter<String>(this,
                                         android.R.layout.simple_list_item_1,
                                         new ArrayList<String>());
        adapter.setNotifyOnChange(true);
        listview.setAdapter(adapter);

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                int count = adapter.getCount();
                adapter.add(String.valueOf(count));
                listview.setSelection(count);
            }
        });
    }
}

이것이 "커뮤니티 위키"이므로 자유롭게 추가하거나 개선하십시오.


하단에 버튼이있는 RelativeLayout을 사용해보십시오. 레이아웃의 높이를 "wrap_content"로 설정합니다. 나는 그것을 시도하지 않았습니다. 그냥 생각


LinearLayout에서 android:layout_weight="1"ListView에 추가하십시오.


다음은 나를 위해 일한 것입니다 ...

 if(adapter.getCount() > 3){
                    View item = adapter.getView(0, null, impDateListView);
                    item.measure(0, 0);         
                    LayoutParams params = impDateListView.getLayoutParams();
                    params.width = LayoutParams.MATCH_PARENT;
                    params.height = 3 * item.getMeasuredHeight();
                    impDateListView.setLayoutParams(params);


                }

참고 : params.width = ... 또한 설정해야합니다 ...

위의 예는 TableRow 내부에서 TableRow 및 ListView를 사용하는 경우입니다.


wrap content in linear layout

in List View add: android:layout_weight="1"

in your Button set fixed height

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

<ListView
    android:id="@+id/my_list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1">
</ListView>

 <Button
    android:text="Button"
    android:layout_width="match_parent"
    android:layout_height="50dp"/>

</LinearLayout>

If you want the content below the list view to move down as elements are added to the list, try this solution:

Add positive padding to the bottom of the list view and negative padding to the top of the "footer". This will work in a linear layout or a relative layout.

<ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="50dp"/>

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="-50dp"/>

Since there's no MaxHeight attribute, your best bet is either to set the height of the ListView to a set value, or to use wrap_content.


I solved this by putting the ListView inside a ScrollView. Lint didn't like it, but by adding a minHeight and setting the fillViewport to true, I have a nice result.

    <ScrollView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="1dp"
        android:layout_marginRight="1dp"
        android:minHeight="100dp"
        android:fillViewport="true"
        android:fadeScrollbars="false"
        android:paddingTop="2dp" 
        android:orientation="vertical"
        android:scrollbarAlwaysDrawVerticalTrack="true" >

        <ListView
            android:id="@+id/workoutAElistRoutines"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="fill_vertical"
            android:background="@drawable/dialog_inner_border_tan"
            android:choiceMode="singleChoice"
            android:orientation="vertical"
            android:paddingLeft="3dp"
            android:paddingRight="3dp" >

        </ListView>
    </ScrollView>        

참고URL : https://stackoverflow.com/questions/5487552/limit-height-of-listview-on-android

반응형