📌 RecyclerView 호출 순서
getItemCount() 아이템 몇개인지 판단
-> getItemViewType() 현재 아이템뷰의 포지션에 해당하는 뷰타입 판단
-> onCreateViewHolder() 뷰타입에 해당하는 뷰홀더를 생성하여 리턴
-> onBindViewHolder() 생성된 뷰홀더와 포지션 전달받아 현재 포지션에 맞는 데이터를 뷰홀더가 관리하는 뷰들에 바인딩👉 즉, 화면에 4개의 리스트가 보인다면 맨 처음 getItemCount() 불리고 그 후 4번 etItemViewType, onCreateViewHolder, onBindViewHolder 가 연속적으로 호출됨
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_medical_record"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
tools:listitem="@layout/rv_item" />
</RelativeLayout>
기존 리사이클러뷰 어댑터에서 뷰타입을 헤더와 아이템으로 나누어서 구성해준다
마찬가지로 데이터가 없을 때 보여줄 화면 레이아웃 파일을 만들어준다
private const val HEADER = 0 // 헤더 뷰
private const val ITEM = 1 // 리사이클러 아이템 뷰
private const val EMPTY = 2 // 데이터가 없을 때 뜨는 뷰
아이템이 없을 때만 헤더와 빈 화면 뷰타입을 리턴해준다
override fun getItemViewType(position: Int): Int {
return if (item.size != 0) {
if (position == 0) HEADER else ITEM
} else {
if (position == 0) HEADER else EMPTY
}
}
// 헤더 부분에 해당하는 뷰객체 가지는 뷰홀더
class HeaderViewHolder(val binding: RvItemHeaderBinding) :
RecyclerView.ViewHolder(binding.root) {}
// 항목에 해당하는 뷰객체 가지는 뷰홀더
class ItemViewHolder(val binding: RvItemBinding) :
RecyclerView.ViewHolder(binding.root) {
with(binding) {
tvDate.text = item.date
tvName.text = item.name
}
}
// 데이터가 없을 때 보여줄 부분에 해당하는 뷰객체 가지는 뷰홀더
class EmptyViewHolder(val binding: RvItemEmptyBinding) :
RecyclerView.ViewHolder(binding.root) {}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
HEADER ->
HeaderViewHolder(
RvItemHeaderBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
ITEM ->
ItemViewHolder(
RvItemBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
EMPTY -> // EMPTY
EmptyViewHolder(
RvItemEmptyBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
else -> {
throw ClassCastException("Unknown viewType $viewType")
}
}
}
아이템이 있을 경우 아이템 전체 갯수 + 헤더1 을 리턴
아이템이 비었을 경우 헤더1 + 빈 화면1 = 2를 리턴 해준다
override fun getItemCount(): Int {
return if (item.size == 0) 2 else item.size + 1
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
// HEADER
is HeaderViewHolder -> {}
// ITEM
is ItemViewHolder -> {
holder.bind(item[position])
}
is EmptyViewHolder -> {}
}
}
잘보고갑니다