Android에서 상위 ListView 항목 위와 마지막 아래에 여백 추가


147

이것은 안드로이드의 ListView에서 항목의 레이아웃에 관한 아주 좋은 질문입니다.

상단에 제목 표시 줄이 있고 화면의 나머지 부분을 차지하는 ListView가있는 활동이 있습니다. ListView가 왼쪽, 오른쪽 및 상단에 10dp 패딩으로 나타나기를 원하지만 ListView를 위로 스크롤하면 페이딩 된 가장자리 아래에서 사라지기 전에 상단 10dp 패딩을 덮고 싶습니다. 마찬가지로 맨 아래로 스크롤하면 마지막 목록 항목의 맨 아래와 화면의 실제 맨 아래 사이에 10dp와 함께 마지막 목록 항목이 나타납니다. 이유가 궁금한 경우 원하는 배경 이미지가 있기 때문입니다 ListView를 파고 들어).

ListView 자체에 패딩을 추가하려고 시도했지만 목록을 스크롤하면 패딩 가장자리 아래에서 사라집니다.

나는 웹 개발자 배경에서 왔으며 비유는 첫 번째 목록 항목 위에 (그리고 마지막 목록 항목 아래에) 여백을 추가하는 것입니다.


왼쪽 및 오른쪽 여백을 지정하십시오 ... 여기에 XML을 붙여 넣으십시오. 그래서 문제 편집을 볼 수 있습니다 : 잠깐, 당신은 의미합니다 .... 상단 및 하단 패딩도 스크롤 하시겠습니까?
Tek Yin

왼쪽 및 오른쪽 여백을 지정할 수 없습니다. Android 레이아웃에는 '여백'이 없으며 패딩 만 있습니다. 그러나 예, 상단 및 하단 패딩이 스크롤되기를 원합니다.이를 설명하는 좋은 방법입니다.
Mick Byrne

나는 이미 몇 가지 방법을 시도했지만 여전히 실패했습니다. 할 수있는 몇 가지 트릭이 있지만 더 어려울 것입니다 ... 첫 번째 및 마지막 위치의 목록 항목에 2 개의 사용자 정의 객체를 넣습니다. 항목을 감지하고 다르게 그리기 (좁은 높이 및 투명)
Tek Yin

그래 ... 그게 내가 다시 생각하고 있던거야. 그러나보기와는 달리 목록 항목의 배경색을 설정해야하기 때문에 모든 종류의 복잡한 문제가 있습니다. 즉, 물건을 두 드렸을 때 표시하려면 효과를 수동으로 해킹해야합니다. . 어쨌든 도움을 주셔서 감사합니다 ...
Mick Byrne

좋은 소식 .. 해결책이 있습니다 ... ListActivity에서 addHeaderView (View v)를 사용할 수 있습니다. 그냥 호출 getListView(). addHeaderView(capView)하고 getListView(). addHeaderView(botView) 목록의 내용을 초기화하기 전에 호출했는지 확인하십시오. setListAdapter (어댑터);
Tek Yin

답변:


397

당신은 썼다 :

ListView 자체에 패딩을 추가하려고 시도했지만 목록을 스크롤하면 패딩 가장자리 아래에서 사라집니다.

ListView's clipToPadding속성을로 설정하십시오 false. 이것은 주위 패딩 가능하게 ListView 하고 레이아웃 (및뿐만 아니라 패딩의 가장자리)의 끝으로 스크롤합니다.

예를 들면 :

<ListView
    android:id="@+id/list_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:divider="@android:color/transparent"
    android:dividerHeight="10.0sp"
    android:padding="16dip"
    android:clipToPadding="false"/>

android:clipToPaddingViewGroup레이아웃 및 뷰 컨테이너의 기본 클래스 인 XML 속성입니다 .

관련 메소드 호출 은 다음 과 같습니다.

public void setClipToPadding (boolean clipToPadding)

4
또한, 다음을 통해 스타일 또는 테마로 만들 수 있습니다.<item name="android:clipToPadding">false</item>
pjco

2
오, 이것은 ScrollView에도 적용됩니다
pjco

4
토론에 조금 늦었지만 구형 장치 (일부 2.3.x 장치에서 발견)에서 목록 항목보기가 너무 빨리 재활용됩니다. 그리기 단계에서는 그리기 단계를 알 수 있지만 레이아웃 단계는 그렇지 않으므로 항목이 이미 화면에서 벗어난 것으로 생각합니다. stackoverflow.com/questions/15915226/…을 참조하십시오 .
Jeffrey Klardie

@JeffreyKlardie 오래된 장치에서 항목이 너무 빨리 재활용되는 문제가 발생하여 스크롤 막대의 크기가 자동으로 조정되어 실제로 이상하게 보입니다. @pjco 왜 그런지 잘 모르겠지만 clipToPadding스타일을 통한 설정 이 효과가 없다면 적용되지 않는 것과 같습니다. 그러나 ListView에서 직접 설정하면 작동합니다.
ForceMagic

5
android:scrollbarStyle="outsideOverlay"스크롤바가 패딩을 완전히 통과하는 것을 잊지 마십시오
jfcartier

19
View padding = new View(this);
padding.setHeight(20); // Can only specify in pixels unfortunately. No DIP :-(

ListView myListView = (ListView) findViewById(R.id.my_list_view);

myListView.addHeaderView(padding);
myListView.addFooterView(padding);

myListView.setAdapter(myAdapter);

위의 ListView에는 20 픽셀의 머리글과 바닥 글 패딩이 있습니다.


4
답변 해주셔서 감사합니다! 잘 작동합니다 !! 당신이 높이를 넣을 경우는 DisplayMetrics를 사용하여 수행 할 수 있습니다 DP에서 : float mDensity = getResources().getDisplayMetrics().density; int height = (int) (50 * mDensity + 0.5f); padding.setHeight(height);
토니 Ceralva을

3
또는 더 나은 방법은 getResources (). getDimensionPixelOffset (R.dimen.some_value);를 사용하여 Java 레벨에서 dp의 dimen을 얻는 것입니다.
greg7gkb

1
개발자 사이트에서 배우는 것에 비해 StackOverflow에서 배우는 Android의 양에 대해 정말 놀랐습니다
TrueCoke

1
또는 더 나은(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
Eugen Pechanec

1
API 23에는 View에 "setHeight ()"메서드가 없습니다. 대신 "setMinimumHeight ()"를 사용할 수 있습니다.
KWA

10

@Jakobud의 답변에 부록 ...

내 listView는 이미 android:divider/android:dividerHeightlistView 항목 사이에 투명 간격을 만들기 위해 속성을 사용하고있었습니다. 이를 통해 간단히 android:headerDividersEnabledand android:footerDividersEnabled속성을 추가 하고 머리글 및 바닥 글보기를로 설정할 수 new View(Activity.this)있었습니다.

listView에 이미 디바이더가 설정되어있는 경우 약간 단순화되었습니다.


1
나는 아이템 마진과 패딩 대신에 디바이더를 사용할 수있는 사람에게 조언 할 것입니다. 큰 답변
dzsonni

2

ListFragment@Jakobud 및 @ greg7gkb의 솔루션을 기반으로하는을 사용하는 솔루션.

ListView listView = getListView();
listView.setDivider(null);
listView.setDividerHeight(getResources().getDimensionPixelSize(R.dimen.divider_height));
listView.setHeaderDividersEnabled(true);
listView.setFooterDividersEnabled(true);
View padding = new View(getActivity());
listView.addHeaderView(padding);
listView.addFooterView(padding);

1

@ Gunnar Karlsson의 대답은 좋지만 패딩 뒤에 완전히 있지만 아직 화면에서 완전히 벗어나지 않으면 셀 뷰가 조기에 재활용되는 문제가 있습니다. clipToPadding = 거짓이 담당하며 또는 안드로이드의 미래 버전에서 수정되지 않을 수 설정. ( ListView에의 항목에 clipToPadding를 사용하는 경우 것은 조기에 재활용 얻을 )

부작용이없는 멋진 간단한 해결책이 있습니다.

  1. cell_design.xml에 외부 (선형 또는 상대) 레이아웃 추가
  2. 이 외부 레이아웃에서 패딩 (예 : 10dip)을 추가하여 전체 셀 주위에 "여백"을 만듭니다. (외부 레이아웃의 여백이 아닌 NB 패딩 만 작동 함)
  3. ListView 집합 android:dividerHeight="-10dip"에서 셀 주위의 반대

다른 답변과 비교하여 분배기 색상을 설정할 필요가 없습니다. 최상단 및 최하단 셀에 패딩이 존재하고, 네거티브 디바이더는 사이에 이중 높이 디바이더를 방지합니다.


"부작용 없음"은 사실이 아닙니다. 보기 계층 구조, 특히 목록보기 항목에 다른 계층을 추가하면 성능이 저하됩니다.
Teovald
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.