RecyclerView ?
RecyclerView
는 아이템을 동적으로 추가, 제거, 재배치할 수 있으며, 스크롤 가능한 목록을 표시하기 위해 사용됩니다. 이를 통해 대용량의 데이터 세트를 처리하고, 화면에 보이는 아이템만 렌더링하여 메모리와 처리 리소스를 효율적으로 관리할 수 있습니다. 따라서 항목이 스크롤되어 화면에서 벗어나더라도 view를 제거하지 않고, 화면에서 스크롤된 새 항목의 뷰를 재사용합니다.
RecyclerView 핵심 컴포넌트
RecyclerView : 아이템 목록을 표시하는 컨테이너 역할을 합니다. XML 레이아웃 파일에서 RecyclerView를 정의하고, 액티비티나 프래그먼트에서 해당 뷰를 참조하여 사용합니다.
LayoutManager : 아이템의 배치와 스크롤 동작을 관리합니다. RecyclerView는 다양한 레이아웃 관리자를 지원하며, LinearLayoutManager, GridLayoutManager, StaggeredGridLayoutManager 등이 있습니다. 각 레이아웃 관리자는 아이템을 어떤 형태로 배치할지 결정합니다.
LinearLayoutManager
: 수평 또는 수직으로 아이템을 선형으로 배치합니다.
GridLayoutManager
: 그리드 형태로 아이템을 배치합니다.
StaggeredGridLayoutManager
: 그리드 형태로 아이템을 배치하지만, 각 아이템의 크기가 다를 수 있습니다.
Adapter : RecyclerView와 데이터 소스 간의 중개자 역할을 합니다. 데이터를 아이템으로 변환하여 RecyclerView에 제공하고, 각 아이템의 뷰를 생성하고 관리합니다. Adapter는 RecyclerView.Adapter 클래스를 상속받아 구현하며, 필수 메서드로 데이터 바인딩, 아이템 개수 반환, 뷰홀더 생성 등의 작업을 수행합니다.
ViewHolder : 각 아이템의 뷰와 데이터를 보유하고 재활용하는 역할을 합니다. RecyclerView.ViewHolder 클래스를 상속받아 구현하며, 아이템의 뷰와 데이터를 바인딩하여 표시합니다. 뷰 홀더는 Adapter에서 관리되며, 재활용을 통해 스크롤 동작 시에도 효율적으로 뷰를 표시할 수 있습니다.
예제
RecyclerView
는 LayoutManager
에게 아이템의 배치와 스크롤 동작을 위임합니다.LayoutManager
는 필요한 아이템의 개수를 Adapter
로부터 요청하고, 아이템의 뷰를 생성합니다.LayoutManager
는 생성한 뷰를 ViewHolder
에 바인딩하고, RecyclerView
에 전달합니다.RecyclerView
는 생성된 ViewHolder
를 받아서 화면에 표시합니다. 이때, LayoutManager
는 필요한 아이템만을 화면에 로드하여 효율적으로 메모리를 관리합니다. 스크롤 동작이 발생하면, LayoutManager
는 새로운 아이템을 로드하거나 기존 아이템을 재사용하여 화면에 표시합니다.RecyclerView
는 해당 이벤트를 감지하고 이벤트를 처리하는 리스너들을 호출합니다. 예를 들어, 아이템 클릭, 스크롤, 드래그 등의 이벤트를 처리할 수 있습니다.Adapter
는 데이터 소스로부터 변경된 데이터를 가져와 갱신합니다. 이후 RecyclerView
에게 데이터 변경을 알리고, 다시 아이템을 로드하고 화면을 갱신합니다.class NotificationRecyclerViewAdapter(var notifications: List<NotificationData>?) :
RecyclerView.Adapter<NotificationRecyclerViewAdapter.ViewHolder>() {
inner class ViewHolder(
val binding: RecyclerItemNotificationBinding
) : RecyclerView.ViewHolder(binding.root) {
fun bind(eachNotification: NotificationData) {
binding.notificationData = eachNotification
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(
RecyclerItemNotificationBinding.inflate(
LayoutInflater.from(parent.context), parent, false
)
)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
notifications?.get(position)?.let { holder.bind(it) }
}
override fun getItemCount(): Int {
return notifications?.size?: 0
}
}
OnCreateViewHolder
OnBindViewHolder
getItemCount
class NotificationFragment :
BindingFragment<FragmentNotificationBinding>(R.layout.fragment_notification) {
.
.
private var adapter = NotificationRecyclerViewAdapter(notifications)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
.
.
initRecyclerView()
}
private fun initRecyclerView() {
binding.notificationRecycler.layoutManager =
LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
binding.notificationRecycler.adapter = adapter
}
.
.
.
}
https://developer.android.com/guide/topics/ui/layout/recyclerview?hl=ko