public class RecyclerView
extends ViewGroup implements ScrollingView, NestedScrollingChild2
안드로이드 공식 문서에 따르면 이렇다.
ViewGroup을 확장받고, ScrollingView, NestedScrollingChild2를 상속받고 있다.
이번 기회를 통해 파도타기를 하면서 개념을 좀 확장해보고자 한다.
이미 이 부분들을 아는 사람들은 밑으로 넘어가도 좋다
View와 ViewGroup이란?
안드로이드 화면을 구성하는 요소로는 View와 ViewGroup이 있다.
앱을 실행했을 때, 화면에 보이는 모든 요소는 뷰(View)이고, 이러한 뷰(View)들을 담아 화면에 적절히 배치하기 위해 ViewGroup이 쓰인다.
예시를 하나만 들어보자면, 책을 책장에 정리하고자 해보자
역사책, 과학책.. 등 다양한 책이 있을 수도 있고 책장에 화분들을 놓아서 꾸밀 수도 있을 것이다. 또한, 이런 요소들을 우리가 알고 있는 일반적인 책장에 일렬로 배치할 수도 있을 것이고 특이하게 생긴 책장에 내가 원하는대로 겹쳐서 배치할 수도 있을 것이다.
여기서 다양한 종류의 책, 화분등은 뷰(View)에 이 View들을 책장에 배치하기 위한 책장(일종의 컨테이너)는 뷰그룹(ViewGroup)에 해당한다고 할 수 있겠다.
뷰라고 불리는 위젯들은 View 클래스를 상속받는다.
뷰그룹이라고 불리는 레이아웃들은 ViewGroup 클래스를 상속받는다.
ViewGroup클래스는 View클래스를 상속받는다.
따라서, 뷰그룹 역시 일종의 뷰이므로 뷰그룹 안에 뷰그룹을 배치할 수 있다. (그래서 우리가 ConstraintLayout안에 LinearLayout등을 배치할 수 있었던 것..!!)
ScrollingView란?
구현하려는 내용의 높이가 실제 화면의 높이보다 클 때 해당 뷰를 ScrollView로 감싸면 화면을 스크롤 할 수 있게 해서 밑의 내용들을 모두 보여준다.
→ ScrollView는 하나의 View만 감쌀 수 있다!
NestedScrollView란?
직독직해하면 Nested(중첩된) ScrollView라는 뜻이다.
Q1. 그럼 그냥 ScrollView와 다른 점은?
A1.아까 위에서 말했던 ScrollView는 하나의 View만을 감쌀 수 있다고 설명한 바 있다. 예를 들면, 일반 ScrollView는 ScrollView 내에 RecyclerView가 있으면 RecyclerView의 스크롤 동작이 제대로 작동되지 않을 수 있다.
따라서 복잡한 레이아웃을 가진 애플리케이션(ex: 여러개의 입력필드, 다양한 종류의 컨텐츠를 세로로 길게 나열하여 모든 컨텐츠를 스크롤 가능하게 할 때)에서 사용한다.
Q2. NestedScrollingChild는?
A2. 중첩된 스크롤 이벤트를 처리하기 위해 필요한 메서드들을 정의한다. 부모 뷰(NestedScrollingParent)에 스크롤 이벤트를 전달하거나, 부모 뷰로부터 스크롤 이벤트를 수신하는 메서드들이 포함될 수 있다.
ViewGroup을 확장하여(extends) 다수의 항목을 효율적으로 표시하고 관리할 수 있는 기능을 제공한다.
ScrollingView와 NestedScrollingChild2 인터페이스를 구현하여(Implements) 기본 스크롤 동작과 중첩된 스크롤 동작을 지원한다.
⇒ 다양하고 많은 항목들을 스크롤 뷰를 통해 효율적 으로 화면에 표시하고 관리할 수 있게 한다.
Q1. 왜 효율적인데?
A1. ListView를 만약 사용했다고 가정하면, 리스트 항목이 갱신될 때마다 매번 아이템 뷰를 새로 구성해야 한다. 이는 많은 항목들을 나열하는데 있어서 성능을 저하시킬 수 있다.
또한 ListView에서는 아이템들을 수직 방향으로 나열할 수 있는데, 수평방향으로 아이템을 나열하기 위해서는 리스트 뷰의 많은 부분들을 재구현해야된다는 단점이 있다. 또한 아이템 뷰들을 동적으로 구성하기에도 쉽지 않다는 한계가 있다. (사용자의 선택에 따라 아이템 뷰를 새로운 형태로 바꾸기 위해서 어댑터 내에서 개발자가 직접 처리해야된다는 번거로움 또한 수반될 수 있다고 한다.)
이후에 RecylcerView사용법과 Adapter중 ListAdapter에 대해 자세하게 알아보는 글을 가져오겠습니다~