I am trying to configure an onclick listerner on a recyclerView to click on items so each click on an item can go to its detail fragment. I have been trying to use the method "onBindViewHolder" but no luck. I am not sure if I can use an interface or just the mentioned method.
========================================================================================
The Adapter
class TensesAdapter(private val sectionList : ArrayList<Tenses>) : RecyclerView.Adapter<TensesAdapter.MyViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.list_item,
parent, false)
return MyViewHolder(itemView)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val currentItem = sectionList[position]
holder.sectionImage.setImageResource(currentItem.sectionImage)
holder.tvHeading.text = currentItem.sectionHeading
holder.itemView.setOnClickListener(object :View.OnClickListener {
}
})
}
override fun getItemCount(): Int {
return sectionList.size
}
class MyViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView) {
val sectionImage : ImageView = itemView.findViewById(R.id.sectionImage)
val tvHeading : TextView = itemView.findViewById(R.id.sectionHeading)
}
CodePudding user response:
You can use an interface,
interface OnTensesClickListener {
fun onItemClick(tenses : Tenses)
}
In your TensesAdapter
,
class TensesAdapter(private val sectionList : ArrayList<Tenses>, private val onTensesClickListener: OnTensesClickListener): RecyclerView.Adapter<TensesAdapter.MyViewHolder>() {
// Your Code...
}
In onBindViewHolder
,
holder.itemView.setOnClickListener(object :View.OnClickListener {
onTensesClickListener.onItemClick(currentItem)
})
Finally, in fragment while initializing...
val adapter = TensesAdapter(sectionList, object: OnTensesClickListener {
fun onItemClick(currentItem) {
// Navigate to other fragment
}
})
CodePudding user response:
Hello my friend,
Thank you very much for your feeback, I have entered the below code on the adapter and the fragment, but I am just missing the code to put on the on-click listerner to go to the specific position when an item is clicked.
Adapter
interface OnTensesClickListener {
fun onItemClick(tenses : Tenses)
}
class TensesAdapter(private val sectionList : ArrayList<Tenses>,private val onTensesClickListener: OnTensesClickListener) : RecyclerView.Adapter<TensesAdapter.MyViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.list_item,
parent, false)
return MyViewHolder(itemView)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val currentItem = sectionList[position]
holder.sectionImage.setImageResource(currentItem.sectionImage)
holder.tvHeading.text = currentItem.sectionHeading
holder.itemView.setOnClickListener(object :View.OnClickListener {
override fun onClick(p0: View?) {
TODO("Not yet implemented")
}
})
}
override fun getItemCount(): Int {
return sectionList.size
}
class MyViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView) {
val sectionImage : ImageView = itemView.findViewById(R.id.sectionImage)
val tvHeading : TextView = itemView.findViewById(R.id.sectionHeading)
}
}
Fragment
package com.baonumerique.loba
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
val adapter = TensesAdapter(sectionList, object: OnTensesClickListener {
fun onItemClick(currentItem) {
// Navigate to other fragment
}
})
class PresentTenseFragment : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_present_tense, container, false)
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment PresentTenseFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
PresentTenseFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
}