[TIL] 2019-12-19 (목)
19 Dec 2019 | TILToday I Learned
-
안드로이드에서 스타일을 만들때에는 마진까지는 적용하지 않는 것이 좋은 것 같다. 동일한 마진을 매번 적용하는 것이 비효율적인 것 같아 타이틀의 스타일에 마진을 넣었었다. 한참 시간이 지난 이후 레이아웃을 수정하려 하는데 마진이 생각대로 적용되지 않아 스타일을 들어가보니 마진이 적용되어 있었다. 레이아웃은 언제든지 수정될 수 있기 때문에 마진값은 항상 변화할 여지가 있고, 스타일을 적용함으로써 얻는 이점보다는 해당 요소에 바로 바로 적용하는 것의 이점이 더 큰 것 같다.
- 기존의 LinearLayout과 비교하여 RecyclerView의 이점이 무엇인지 찾아보았다. StackOverflow에 잘 설명된 글이 있었다.
- 그런데 이 글에는 가장 큰 이점이 빠져있는 것 같다. 바로, 리사이클러뷰는 이름 그대로 뷰 객체를 재활용한다는 것이다. 만약 내가 100개의 항목이 있는 리스트를 만든다고 가정하자. 리사이클러뷰가 아닌 기존의 레이아웃들을 활용하면 100개의 뷰(View) 객체가 생성된다. 하지만 리사이클러뷰를 사용하면 한 화면에 보이는 개수만큼의 뷰가 생성되고, 스크롤을 하며 뷰가 화면을 벗어날 때 해당 뷰들을 버리지 않고 재활용한다. 만약 한 화면에 10개의 리스트 항목이 보인다고 가정하면 총 10개의 객체만 생성되어 이 뷰들이 계속 재활용되는 것이다.
-
아래는 해당 원문을 번역한 것이다.
장점
-
뷰홀더 패턴(ViewHolder Pattern)
리스트뷰에서는 뷰홀더 패턴이 권고사항일뿐 강제되지는 않았습니다. 반면 리사이클러뷰에서는 RecyclerView.ViewHolder 클래스를 사용하는 것이 의무사항입니다. 이는 리스트뷰와 리사이클러뷰의 가장 큰 차이점 중 하나입니다. 이러한 특징은 리사이클러뷰를 사용하는 것을 조금 더 복잡하게 만들지만, 기존의 리스트뷰에서 겪은 문제점들은 효과적으로 해결해줍니다.
-
레이아웃매니저(LayoutManager)
리사이클러뷰의 큰 이점 중 하나입니다. 기존의 리스트뷰에서는 수직(vertical)의 리스트뷰만 가능했고, 수평(horizontal)의 리스트뷰를 만드는 공식적인 방법이 없었습니다. 하지만 리사이클러뷰를 사용함으로 인해, 아래의 레이아웃을 만들 수 있습니다.
i) LinearLayoutManager - 수직/수평 리스트를 모두 지원합니다.
ii) StaggeredLayoutManager - 핀터레스트같이 엇갈린 모양의 레이아웃을 지원합니다.
iii) GridLayoutManager - 갤러리 앱과 같이 그리드 형태의 레이아웃을 지원합니다.
가장 좋은 점은 이 모든 레이아웃을 원하는대로 동적으로 만들 수 있다는 것입니다.
-
아이템 애니메이터(Item Animator)
리스트뷰는 좋은 애니메이션에 대한 지원이 부족하지만, 리사이클러뷰는 완전히 새로운 차원을 열어주었습니다. RecyclerView.ItemAnimator 클래스를 사용함으로써, 뷰에 애니메이션을 적용하는 것이 훨씬 쉽고 직관적이게 되었습니다.
-
아이템 데코레이션(Item Decoration)
리스트뷰에서는 테두리(border)나 구분선(divider)과 같이 아이템들을 동적으로 데코레이팅하는 것이 어려웠습니다. 더 나아가 리사이클러뷰의 RecyclerView.ItemDecorator 클래스는 개발자로 하여금 다양한 부분을 제어할 수 있도록 해줍니다. 하지만 시간이 조금 걸리고 복잡하기는 합니다.
-
아이템 터치 리스너(OnItemTouchListener)
리스트뷰의 AdapterView.OnItemClickListener 인터페이스 덕분에 리스트뷰에서 아이템 클릭을 가져오는 것은 간단했습니다. 나아가 리사이클러뷰의 RecyclerView.OnItemTouchListener는 개발자가 더 강력하고 많은 제어를 할 수 있도록 해줍니다. 하지만 이는 조금 복잡한 일이기는 합니다.
단점
-
리스트뷰보다 조금 더 복잡합니다.
- 초보자가 리사이클러뷰를 완전히 이해하는 데에는 시간이 많이 걸릴 수도 있습니다.
- 코딩이 불필요하게 어려워질 수도 있습니다.
- 리스트뷰를 작업할 때보다 더 많은 시간을 들여야 할 것입니다.
-
Comments