Search code examples
androidkotlinandroid-recyclerviewandroid-adapter

how to add onClickListener in recyclerview?


I don't know how to add onclicklistener to here, I've tried many ways but it doesn't work, i made this with recyclerview, I've tried to add a new variable in the adapter section but error, I've also made activity details so I just need to hit recyclerview and go to details page, I gave the code that has not been added onclicklistener

this MainActivity

class MainActivity : AppCompatActivity() {


private lateinit var adapter: MakeUpAdapter


@SuppressLint("NotifyDataSetChanged")
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

  
    rv_kamu.setHasFixedSize(true)
    rv_kamu.layoutManager = LinearLayoutManager(this)
    adapter = MakeUpAdapter()
    adapter.notifyDataSetChanged()
    rv_kamu.adapter = adapter
    getDataFromApi()

  

}


private fun getDataFromApi() {
    Retrofit.instance.getMakeUpList()
        .enqueue(object : Callback<ArrayList<MakeUpModel>>{
            override fun onResponse(
                call: Call<ArrayList<MakeUpModel>>,
                response: Response<ArrayList<MakeUpModel>>
            ) {
                if(response.isSuccessful) {
                    showData(response.body()!!)
                }
            }

            override fun onFailure(call: Call<ArrayList<MakeUpModel>>, t: Throwable) {
                Log.e("Fail", "Be Fail")
            }

        })
}

private fun showData(data: ArrayList<MakeUpModel>) {
    val result = data
    adapter.setData(result)
}


}

and this adapter

class MakeUpAdapter : RecyclerView.Adapter<MakeUpAdapter.MakeUpViewHolder>(){



private val data = ArrayList<MakeUpModel>()

inner class MakeUpViewHolder (itemView: View) : RecyclerView.ViewHolder(itemView){


    fun bind(data: MakeUpModel) {
        //lib3
        Glide.with(itemView.context)
            .load(data.Picture)
            .apply(
                RequestOptions()
                    .override(100, 100)
            )
            .into(itemView.iv_item)

        itemView.tv_Name.text = data.Name


    }

}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MakeUpViewHolder {
    val view: View =
        LayoutInflater.from(parent.context).inflate(R.layout.item_makeup, parent, false)
    return MakeUpViewHolder(view)
}


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

override fun getItemCount(): Int = data.size


@SuppressLint("NotifyDataSetChanged")
//buat mainac
fun setData(list: ArrayList<MakeUpModel>) {
    data.clear()
    data.addAll(list)
    notifyDataSetChanged()
}



}

Solution

  • This is my way.

    first, create a interface to listen click event:

    interface RecycleViewOnClickListener {
        fun onItemClick(pos :Int)
    }
    

    and in your adapter class, put interface in param, then call listener in onBindViewHolder:

    class MakeUpAdapter(private val clickListener: RecycleViewOnClickListener) : RecyclerView.Adapter<MakeUpAdapter.MakeUpViewHolder>(){
        override fun onBindViewHolder(holder: MakeUpViewHolder, position: Int) {
            holder.bind(data[position])
            holder.itemView.setOnClickListener {
                clickListener.onItemClick(position)
            }
        }
    }
    }
    

    In your activity, implement listener like this:

    class MainActivity : AppCompatActivity(), RecycleViewOnClickListener {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            adapter = MakeUpAdapter(this)
        }
    
        override fun onItemClick(pos: Int) {
            //do anything with your position here, such as get item from result
        }
    }
    

    Hope it's helpful for you