개발/Android

[안드로이드] Recyclerview footer 사용

Eun 2022. 3. 15. 13:32

 

안드로이드 Recyclerview footer 사용법에 관한 포스팅이다. Header도 마찬가지로 같은 방법을 적용하면 된다.

1. footer.xml 추가

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="책 더보기"
            android:textSize="15sp"
            android:textStyle="bold"
            android:textColor="@color/black"/>
        <ImageView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_marginTop="@dimen/activity_top_margin"
            android:src="@drawable/oval_ect"/>
    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

2. Adapter에 Footer에 대한 처리 구현

 

  • getItemCount에 헤더,풋터 개수 포함 (지금 포스팅은 풋터만 해당되므로 +1만 해줌)
  • getItemViewType에 position에 따른 타입 반환 추가
  • 각 타입에 따른 ViewHolder class 추가
  • onCreateViewHolder에서 각 타입에 따른 ViewHolder Class 반환 추가
  • onBindViewHolder에 각 ViewHolder에 따른 처리 추가
package com.example.api_practice.src.main.today.now

import android.content.Context
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.api_practice.R

class NowRecyclerViewAdapter(private val context: Context, private val dataList : ArrayList<BookData>) :
    RecyclerView.Adapter<RecyclerView.ViewHolder>() {


    private val TYPE_ITEM : Int = 1
    private val TYPE_FOOTER : Int = 2

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return when(viewType) {
            TYPE_FOOTER -> {
                val view = LayoutInflater.from(context).inflate(R.layout.rv_home_tab_now_footer, parent, false)
                FooterViewHolder(view)
            }
            else -> {
                val view =  LayoutInflater.from(context).inflate(R.layout.rv_home_tab_now_item, parent, false)
                ListViewHolder(view)
            }

        }

    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when(holder) {
            is FooterViewHolder -> {
                holder.itemView.setOnClickListener {
                    Log.d("푸터 눌렸을 때","눌렸을때")
                }
            }
            else -> {
                val item = dataList[position]
                holder.itemView.apply {
                    val itemViewHolder: ListViewHolder = holder as ListViewHolder
                    itemViewHolder.bind(item)
                }
            }
        }
    }


    // 아이템의 타입을 반환 (position은 0 기반이므로 (전체 갯수 - 1) 일 경우에 Footer 타입 반환)
    override fun getItemViewType(position: Int): Int {
        return when (position) {
            itemCount -1 -> TYPE_FOOTER
            else -> TYPE_ITEM } }


    // 아이템의 전체 갯수 + 헤더(1) + 풋터(1) 지금은 풋터만 사용하므로 +1만 해줌.
    override fun getItemCount(): Int = dataList.size+1

    class FooterViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView)


    inner class ListViewHolder(layout: View): RecyclerView.ViewHolder(layout) {
        private val txtName: TextView = itemView.findViewById(R.id.tv_book_name)

        fun bind(item: BookData) {
            txtName.text = item.booktitle
        }
    }

}

 

완성 화면