Android에서 RecyclerView의 사용은 거의 필수라고 할 수 있다. 왜냐하면 리스트를 보여주는 화면은 대부분의 앱에 존재할 것이기 때문이다. 이번 글은 간단하다. 리싸이클러뷰를 사용하는 사람이라면 글을 읽는데 어려움이 없을 것이다. 사실, 몰라도 볼 수 있다. 그만큼 간단한 글이다.

RecyclerView

리싸이클러뷰는 리스트 화면을 구성하는데 효율적이다. 이유는 View를 재활용하기 때문이다. 화면을 작성하고 보면 리스트의 제일 하단 공간이 아래와 바짝 붙어있는 경우를 본 적이 있을 것이다. 이를 해결하기 위한 방법은 내가 할 수 있는 것 중에서는 두 가지가 있다.

  • ItemDecoration 클래스를 만들어서 마지막 아이템일 경우 공간을 추가하는 방법
  • RecyclerView 자체에 padding을 주는 방법

첫 번째 방법은 addDecoration 키워드를 가지고 검색해보면 답을 구할 수 있다. 이 방법은 추후에 설명하도록 하겠다. 이것보다 훨씬 간단한 두 번째 방법을 설명하겠다. 두 번째 방법 그대로 padding을 RecyclerView에 추가하면 어떻게 될까??

내가 원하는 것처럼 바닥과 공간이 떨어진다. 하지만, 스크롤이 되는 위치도 그만큼 떨어지게 된다. 즉 RecyclerView를 자식으로 가지는 부모 뷰에 꽉 차지 않는 것이다. 이를 해결하기 위해서는 다음의 한 줄을 추가하면 간단하게 해결된다

1
android:clipToPadding="false"

공식 문서의 내용을 보면 다음과 같다.

Defines whether the ViewGroup will clip its children and resize (but not clip) any EdgeEffect to its padding, if padding is not zero. This property is set to true by default.

해석해보면 패딩이 0이 아닌 경우에는 ViewGroup이 자신의 자식 뷰의 영역을 자르고 EdgeEffect의 크기를 조정(clip)할지 여부를 규정한다. 이 속성은 기본적으로 true로 설정되어 있다.

기본적으로 패딩값이 설정되어 있다면 ViewGroup은 자신의 자식 뷰의 영역을 자르고 EdgeEffect(사용자가 2D 공간에서 콘텐츠 경계를 넘어 스크롤할 때 스크롤 가능한 위젯의 가장자리에서 사용하는 그래픽 효과를 말한다.)의 크기를 조정한다. 이 속성을 false로 설정한다는 것은 EdgeEffect의 크기를 조정하지 않는다. 따라서 스크롤 가능한 위젯의 가장자리에서 사용하는 그래픽 효과는 부모 뷰에 맞도록 설정이 된다는 걸 뜻한다.

그래서 스크롤할 때 부모 뷰에서 떨어지지 않고 내가 원하는 동작을 할 수 있다. 이것은 나의 해석과 생각이 담겨 있다. 그래서 사실이 아닐 수도 있다. 질문이나 틀린 점이 있다면 알려주면 피드백 반영해서 수정하도록 하겠습니다.

참고