2021/12/07

1

1일1문서

목록 보기
2/17

https://hamurcuabi.medium.com/recyclerview-item-click-in-a-better-way-c69d9c074ddf

RecyclerView Item Click in a Better Way

기존에는 리사이클러뷰에서 아이템 클릭을 처리하기 위해서는 인터페이스를 사용했다.

어댑터에 클릭 인터페이스를 생성하고 아이템의 position이 있는 onBindViewHolder 혹은
ViewHolder에서 bind처리를 할 때 setOnClickListener에 클릭 리스너를 달아주었다.

이 문서에서는 이 방법의 문제점에 대해서 설명하고 있다.

onBindViewHolder는 리사이클러뷰에서 뷰홀더가 새로 bind될 때마다 호출된다. 즉 setOnClickListener또한 계속해서 호출된다.


해결책

이 문서에서는 clickListener를 onCreateViewHolder에 세팅한다. 왜냐하면 CreateVieweHolder에서 처음 생성될때 한번만 clickListener를 생성해도 되기 때문이다.

이렇게 되면 ViewHolder에서 어떻게 item의 position을 얻느냐에 대한 궁금증이 생기지만 ViewHolder에서는 absoluteAdaptrePosition을 통해서 포지션을 알려준다.

  1. Fragment,Activity에서 itemClick

Fragment,Activity

val adapter = UserAdapter {model -> 
   //The click action you want to perform.
}

Adaptr

class UserAdapter(
    private val onItemClicked: (Model) -> Unit
) : RecyclerView.Adapter<ArtistViewHolder>() {

    var data: List<Model> = ArrayList(0)
        set(value) {
            field = value
            notifyDataSetChanged()
        }

    override fun onCreateViewHolder(parent: ViewGroup, type: Int): UserViewHolder {
        val viewHolder = LayoutInflater.from(parent.context).inflate(R.layout.viewholder_user, parent, false)
        return UserViewHolder(viewHolder) {
            // Pay attention
            onItemClick(values[it])
        }
    }

    override fun getItemCount(): Int = data.size

    override fun onBindViewHolder(viewHolder: ArtistViewHolder, position: Int) {
        viewHolder.bind(data[position])
    }

}

ViewHolder

class UserViewHolder(
    view: View,
    onItemClicked: (Int) -> Unit
) : RecyclerView.ViewHolder(view) {
  
    init {
        itemView.setOnClickListener {
          // Pay attention called only once
            onItemClicked(absoluteAdapterPosition )
        }
    }

    fun bind(model: Model) {
        //bind data
    }
}
profile
러닝커브를 따라서 등반중입니다.

0개의 댓글