Android, GridView의 하단 padding 제거하기 by 오리대마왕

GridView 의 경우 기본적으로 내부 스크롤 영역의 상/하단에 padding이 잡힌다. 따라서 스크롤할 때 shadow가 padding만큼 떠서 생기기 때문에 매우 부자연스럽다.

따라서 GridView를 원하는 대로 쌈빡하게 그리려면 대게 다음 작업이 필요하다.
1. GridView의 selector 때문에 생기는 테두리 여백을 제거한다.
2. GridView 스크롤 영역 상/하단에 생기는 padding을 제거한다.

1번 작업은 다음과 같이 listSelector를 빈 깡통으로 만들어서 해결할 수 있다.
android:listSelector="@android:id/empty" 

2번 작업이 매우 골때리는데, 제 아무리 padding값을 0으로 줘도 하단 padding이 생긴다. 내 경우 수직스크롤만 사용하기 때문에 당연히 android:scrollbars="vertical" 로 줬는데 이게 문제다.

도대체 알 수 없어서 hierarchyViewer로 보니 GridView의 mPaddingBottom이 10px로 잡혀있다. 왜!왜!왜!
그래서 패딩값을 잡는 View.setPadding 메서드의 소스를 보니 다음과 같은 부분이 있다. 참고로 API 레벨 7의 소스다.

(View.java, 7670라인 - 헉 엄청길다..)

            if ((viewFlags & SCROLLBARS_HORIZONTAL) == 0) {
                bottom += (viewFlags & SCROLLBARS_INSET_MASK) == 0
                        ? 0 : getHorizontalScrollbarHeight();
            }

여기서 보면 SCROLLBARS_HORIZONTAL 을 충족하지 못할 경우 bottom padding 에 getHorizontalScrollbarHeight() 를 더해버린다. 즉, horizontal scroll을 "안" 쓸 경우 bottom padding을 맘대로 더한다.
따라서 거꾸로 horizontal scroll을 쓴다고 설정하니 맘에 드는 결과가 나왔다. 엄... 도대체 왜...

이렇게 horizontal scroll 쓴다고 설정해 봤자 grid view는 알아서 vertical 방향으로 잘 나온다.

결과 xml은 너무 간단한데, 이것 때문에 도대체 몇시간을 허비했는지. 휴...

<GridView  android:layout_width="fill_parent" android:layout_height="wrap_content"
android:numColumns="auto_fit" android:columnWidth="40dp"
android:stretchMode="spacingWidthUniform" 
android:scrollbarStyle="insideInset" 
android:listSelector="@android:id/empty" 
android:verticalSpacing="0dp"  android:horizontalSpacing="4dp"
android:padding="0dp" 
android:scrollbars="horizontal|vertical"/>

참고로 scroll 영역 자체의 padding이 아닌, 내부 항목의 padding을 주려면 adapter에서 getView할 때 padding을 먹이던가, draw할 때 알아서 잘 하면 된다.

덧글

※ 로그인 사용자만 덧글을 남길 수 있습니다.