개발 공부/Android / / 2022. 5. 27. 00:39

[Android Kotlin] RecyclerView Footer 넣기

이미 구현 된 RecyclerView가 있다는 전제하에서 진행됩니다. 

 

1. Adapter 클래스로 가서 상속받고 있는 RecyclerView.Adapter의 제네릭 타입을 RecyclerView.ViewHolder로 변경

class TaskListAdapter (val context: Context?, private val taskListData: ArrayList<TaskData>) : RecyclerView.Adapter<RecyclerView.ViewHolder>(){

 

2. 필드에 기본 아이템과 Footer 아이템 구분을 위한 변수 선언

//footer 추가
    private val TYPE_ITEM = 0
    private val TYPE_FOOTER = 1

 

3. Footer 아이템으로 쓸 xml 파일 생성 

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="70dp">
</LinearLayout>

 

4. Adapter 클래스로 가서 Footer ViewHolder 클래스 추가 

//Footer ViewHolder
    internal class FooterViewHolder(footerView: View?) :
        RecyclerView.ViewHolder(footerView!!)

 

5. Adapter 클래스 안의 getItemViewType override 메소드를 추가

//ViewType 반환 하는 부분
    override fun getItemViewType(position: Int): Int {
        return if (position == taskListData.size) TYPE_FOOTER else TYPE_ITEM
    }

 

6. Adapter 클래스 안의 getItemCount 메서드에서 반환하는 리스트 사이즈에 1을 더해준다

//Footer 추가로 사이즈에 1더함
    override fun getItemCount(): Int  = taskListData.size+1

 

7. onCreateViewHolder 내용을 변경해 준다.

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {


        //ViewHolder 한개일 때
//        val view = LayoutInflater.from(context).inflate(R.layout.item_home,parent,false)
//        return ItemViewHolder(view)


//      //ViewHolder 여러개 - viewType(밑에 getItemViewType에서 줌)에 따라서 holder 다르게 반환
        val holder: RecyclerView.ViewHolder
        val view: View
        if (viewType == TYPE_FOOTER) {
            view = LayoutInflater.from(parent.context)
                .inflate(R.layout.item_home_footer, parent, false)
            holder = FooterViewHolder(view)
        } else {
            view = LayoutInflater.from(parent.context)
                .inflate(R.layout.item_home, parent, false)
            holder = ItemViewHolder(view)
        }

        return holder


    }

 

8. onBindViewHolder의 내용도 변경해준다.

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

            val item = taskListData[position]
            holder.itemView.setOnClickListener {
                Toast.makeText(it.context, "Clicked: ${item.title}", Toast.LENGTH_SHORT).show()
            }

            // Item을 하나, 하나 보여주는(bind 되는) 함수입니다.
            // itemViewHolder.onBind(taskListData[position])

        } else {
            val itemViewHolder = holder as FooterViewHolder
        }
        
    }

 

 
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유