개발/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
}
}
}
완성 화면