이미지를 가져오다 보니 모든 디스플레이에서 균등한 비율로 작업해야 할 일이 생겨버렸다.
단순 글라이드 라이브러리를 사용하여 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(); // 변경 사항 적용
소스를 간단하게 설명하자면
디바이스의 가로 길이를 구한다.
필요하다면 세로길이도 구한다.
가로 혹은 세로의 비율을 계산하여 적용한다.
이렇게 하면 동적으로 원하는 크기의 아이템 항목을 구성할 수 있고, 재사용 시 스크롤도 자연스럽게 이동한다.
(다만 조금 느린 감이 있다.)
매번 디스 플레이의 값을 구하지 않고, 메인에서 한 번만 호출하여 등록해도 된다.
'안드로이드' 카테고리의 다른 글
MVC vs MVP vs MVVM 용어 정리 (0) | 2017.12.31 |
---|---|
안드로이드 네이버 지도 사용하기 (Fragment) (9) | 2017.12.26 |
다음 지도 api 갤럭시 s8 .so 파일 찾을 수 없는 오류 해결 방법 (0) | 2017.12.21 |
안드로이드 XML 파싱 (0) | 2017.12.12 |
Intent와 Bundle의 차이 (0) | 2017.11.14 |