본문 바로가기
프로그래밍/Android

RecyclerView의 ViewHolder가 wrap_content만 적용될 때

by Daniel.kwak 2020. 12. 19.

분명 RecyclerView도 math_parent, ViewHolder의 xml도 math_parent로 만들었는데, 빌드해보면 ViewHolder가 자꾸 wrap_content로 적용되는 이슈가 있었다. LayoutInspector를 돌려봐도 wrap_content로 나온다.

 

width 값을 고정 dp로 줘봐도 여전히 똑같고 이래저래 할 수 있는건 다 해봤는데 달라지지 않아서 혹시 ViewHolder를 Inflate할 때 주는 옵션같은게 있나? 해서 찾아보았더니, LayoutInflater를 잘못 쓰고 있었다.

 

공식 문서에서 가져온 LayoutInflater의 inflate 함수이다. 설명은 간단하게 인자값으로 넣은 xml으로 새로운 뷰 계층을 만들어준다.

인자값은 resource, root, attatchToRoot를 넣어주는데, resource는 xml의 고유 id 값을 넣어준다.

root는 만들어질 뷰 계층의 부모 ViewGroup을 지정할 수 있는 옵셔널한 속성이다. 이는 세번째 인자인 attachToRoot 값에 따라서 달라지는데, 부모 ViewGroup을 지정하고 attachToRoot 속성이 true이면 부모 ViewGroup에 attached되고, false이면 부모 ViewGroup은 단지 부모 ViewGroup의 LayoutParams의 하위 클래스를 그대로 생성하는데에만 쓰이게 된다는 것이다. root는 null이 될 수 있다.

그러면 여기서 말하는 LayoutParams 는 무엇일까?

 

View가 있을 때, 그 View의 부모들(?)에게 어떻게 레이아웃을 원하는 방식으로 만들지 알려준다. 기본 LayoutParams 클래스는 너비와 높이 대해 뷰가 원하는 크기를 가진다. 또한, ViewGroup의 여러 하위 클래스에 대한 LayoutParams의 하위 클래스가 있다. 예를 들어 AbsoluteLayout에는 X 및 Y 값을 추가하는 LayoutParams의 자체 하위 클래스가 있는것.

 

결론

ViewHolder를 만들 때, 부모의 ViewGroup을 알아야 math_parent 속성을 사용할 수 있다. 계산된 width를 알 수 있어야 하기 때문!

 

 

'프로그래밍 > Android' 카테고리의 다른 글

안드로이드 서비스 (2)  (0) 2019.02.18
안드로이드 서비스 (1)  (1) 2019.02.18
액티비티 재생성  (0) 2019.02.16
안드로이드 액티비티 생명주기  (0) 2019.02.16
안드로이드 Notification  (0) 2018.12.07
dp/dip/sp/px 단위와 멀티해상도  (0) 2018.12.07