[Android/Kotlin] Recyclerview Header 달기 + 데이터가 없을 때 보여줄 화면 다르게 하기

SoyoungLee·2022년 5월 25일
2

안드로이드/코틀린

목록 보기
20/68
post-thumbnail
post-custom-banner

💌 [안드로이드/코틀린] Recyclerview Header 달기 + 데이터가 없을 때 보여줄 화면 다르게 하기

📌 RecyclerView 호출 순서

getItemCount() 아이템 몇개인지 판단
-> getItemViewType() 현재 아이템뷰의 포지션에 해당하는 뷰타입 판단
-> onCreateViewHolder() 뷰타입에 해당하는 뷰홀더를 생성하여 리턴
-> onBindViewHolder() 생성된 뷰홀더와 포지션 전달받아 현재 포지션에 맞는 데이터를 뷰홀더가 관리하는 뷰들에 바인딩

👉 즉, 화면에 4개의 리스트가 보인다면 맨 처음 getItemCount() 불리고 그 후 4번 etItemViewType, onCreateViewHolder, onBindViewHolder 가 연속적으로 호출됨

recyclerview 를 붙일 메인 레이아웃

<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
        }
    }

💜 ViewHolder 추가

// 헤더 부분에 해당하는 뷰객체 가지는 뷰홀더
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
}

💜 Holder 에 따른 바인딩 처리

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {

        when (holder) {
            // HEADER
            is HeaderViewHolder -> {}
            // ITEM
            is ItemViewHolder -> {
                 holder.bind(item[position])
        }
        	is EmptyViewHolder -> {}
    }
}
profile
Android Developer..+ iOS 슬쩍 🌱 ✏️끄적끄적,,개인 기록용 👩🏻‍💻
post-custom-banner

2개의 댓글

comment-user-thumbnail
2023년 5월 3일

잘보고갑니다

답글 달기

꽉 찬 정보 정말 감사합니다. 멋있어요!

답글 달기