안드로이드

안드로이드 리사이클러 뷰 그리드 레이아웃 아이템 세로 동적 비율

하늘을난모기 2017. 12. 23. 00:26

이미지를 가져오다 보니 모든 디스플레이에서 균등한 비율로 작업해야 할 일이 생겨버렸다.


단순 글라이드 라이브러리를 사용하여 wrap_content로 할 경우 재사용 뷰의 특성 때문에 스크롤 시 이미지의 사이즈를 0으로 두기에 다시 불러오면서 스크롤의 부자연스러움이 생긴다.


해결 방법으로 동적 사이즈를 자바 코드로 하여금 만들었다.



[ 해결방법 ]


1. 아이템의 레이아웃은 부모 레이아웃을 제외하고는 모두 match_parent로 바꾼다. (필요 시 가로만, 혹은 세로만 바꾼다.)


2. 리사이클러뷰의 adapter로 들어가 onBindViewHolder에 다음과 같은 라인을 작성한다.


DisplayMetrics displayMetrics = new DisplayMetrics();

((Activity) holder.itemView.getContext()).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);


int deviceWidth = displayMetrics.widthPixels;  // 핸드폰의 가로 해상도를 구함.

// int deviceHeight = displayMetrics.heightPixels;  // 핸드폰의 세로 해상도를 구함.

deviceWidth = deviceWidth / 2;

int deviceHeight = (int) (deviceWidth * 1.5);  // 세로의 길이를 가로의 길이의 1.5배로 하고 싶었다.


holder.itemView.getLayoutParams().height = deviceHeight;  // 아이템 뷰의 세로 길이를 구한 길이로 변경

holder.itemView.requestLayout(); // 변경 사항 적용


소스를 간단하게 설명하자면

디바이스의 가로 길이를 구한다.

필요하다면 세로길이도 구한다.

가로 혹은 세로의 비율을 계산하여 적용한다.


이렇게 하면 동적으로 원하는 크기의 아이템 항목을 구성할 수 있고, 재사용 시 스크롤도 자연스럽게 이동한다.

(다만 조금 느린 감이 있다.)


매번 디스 플레이의 값을 구하지 않고, 메인에서 한 번만 호출하여 등록해도 된다.