인스타그램, 유튜브 등과 같은 앱을 보면 리스트 형식으로 되어 있는 것을 볼 수 있다. 거의 모든 앱에 사용되어 지고 있다. 이때 사용되는 것이 RecyclerView이다. ListView와 RecyclerView 두 가지 모두 리스트 형식으로 되어 있다. 그럼 어떤 차이점이 있는지 알아보자
ListView는 안드로이드 플랫폼에서 오래된 버전부터 사용된 View이며, ArrayAdapter
또는 BaseAdapter
를 사용하여 데이터와 뷰를 연결한다.
ListView
는 아이템의 전체 개수를 보여주는 것이 아니라 화면에 보여지는 만큼만 View를 그려놓고 그것을 다시 재활용할 수 있는 구조로 되어 있다.
위의 그림처럼 10개의 아이템이 있고 5개가 화면에 보인다면 10개의 부 객체가 Setting 된 후 모두 보여주는 것이 아니라 5개의 뷰 객체만 보여준다. 스크롤을 하게 되면 3번째 View는 사라지고 8번째 View가 보여지게 된다. 이때 View는 새로 생성되는 것이 아니라 기존의 View를 재사용하여 화면에 Setting되어진다.
ConvertView
: 실제 화면에 그려지는 아이템을 관리하는 배열
ConvertView
는 화면에 보여주는 View를 생성하고 스크롤을 하면 View 재활용하고 Adapter의 getView()
를 통해서 관리되어 진다.
새로운 아이템이 생성될 떄 마다 getView()가 호출한다
var mainView = convertView
if(mainView == null){
rowBiding = RowBinding.inflate(layoutInflater)
mainView = rowBiding.root
mainView!!.tag = rowBiding
}
else {
rowBiding = mainView!!.tag as RowBinding
}
ConvertView
가 null이면 inflate을 통해 아이템을 설정하고 재활용되는 뷰를 tag를 통해 관리한다.
ConvertView
가 null이 아니라면 tag에 저장되어 있는 뷰를 rowBinding에 데이터를 바꾸어 메모리를 낭비하지 않도록 한다.
RecyclerView
는 안드로이드 지원 라이브러리인 Support Library에 속하는 컴포넌트로서 ListView의 대안으로 도입되었다. LayoutManager
를 사용하여 아이템의 배치와 스크롤 동작을 제어하고 RecyclerView.Adapter
를 통해 데이터와 뷰를 연결한다.
RecyclerView
는 ListView와는 다르게 ViewHolder
패턴을 사용하여 뷰를 재활용한다.
ViewHolder
는 리스트 아이템의 뷰를 보유하고 있고, 이를 관리하는 역할을 한다.
ViewHolder
에는 해당 아이템의 뷰를 참조하는 주소값을 가지고 있어 화면에 뷰가 보여질 때 그 주소값을 통해 해당하는 데이터를 가져와서 아이템의 뷰를 보여주도록 한다.
inner class RecyclerAdapterClass : RecyclerView.Adapter<RecyclerAdapterClass.ViewHolderClass>() {
inner class ViewHolderClass(rowBinding: RowBinding) : RecyclerView.ViewHolder(rowBinding.root) {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolderClass {
}
override fun onBindViewHolder(holder: ViewHolderClass, position: Int) {
}
override fun getItemCount(): Int {
}
}
그럼 ViewHolder
는 어디에서 생성이 될까? 바로 onCreateViewHolder()
메서드에서 ViewHolder가 생성이 된다. findViewById() 또는 ViewBinding을 통해 ViewHolder의 필드를 저장하고 이 후 onBindViewHolder()
메서드에서 해당 뷰를 사용하여 데이터를 설정하거나 뷰를 업데이트 한다.