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로만 지원되는 버튼이 수평 중앙에 위치하기를 원했기 때문에
LinearLayout
android : orientation = "horizontal"을 "vertical"로 변경했습니다.
AngeloS는 또한 그의 초기 게시물
android:layout_weight="0.1"
에서LinearLayout
주변의 매개 변수ListView
가 어떤 영향을 미쳤 는지 확실하지 않다고 말했습니다 . 나는 방금 시도했고 실제로 그렇습니다! 그렇지 않으면 버튼이 다시 화면 밖으로 밀려납니다.
나는이 정확한 문제가 있었고 그것을 해결하기 위해 각각 및 각각 LinearLayouts
을 수용 하기 위해 두 개의 분리 를 만들었습니다 . 거기에서 두 가지를 모두 넣고 해당 컨테이너 를 . 나는 또한의 무게 설정 을 보관 에를 하지만 어떤 효과가 있을지 모릅니다. 여기에서 버튼이있는 하단 컨테이너의 높이를 원하는 높이로 설정할 수 있습니다.ListView
Button
Linear Layout
android:orientation
vertical
LinearLayout
ListView
0.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
하여 ListView
및 Button
에 높이를 설정하고 wrap_content
에 weight = 1을 추가합니다 ListView
. 원하는대로 작동합니다.
그리고 예, 설정 layout_gravity
의를 Button
에bottom
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
'IT story' 카테고리의 다른 글
바로 가기 키를 사용하여 Visual Studio 텍스트 편집기를 확대 / 축소하는 방법이 있습니까? (0) | 2020.09.09 |
---|---|
R의 숫자에 대한 쉼표 구분 기호? (0) | 2020.09.09 |
System.IdentityModel.Tokens.Jwt를 사용하여 JWT 토큰 디코딩 및 확인 (0) | 2020.09.09 |
TextInput에 포커스가있을 때 키보드 뒤에서 창을 자동으로 슬라이드하는 방법은 무엇입니까? (0) | 2020.09.09 |
스크럼 스프린트를 계속할 때 번 아웃이 발생할 수 있습니까? (0) | 2020.09.09 |