在 Kotlin 中如何设置回收器视图适配器的单击事件



我是 kotlin android 的新手。我已经为回收器视图创建了适配器。但是我无法为每个回收器视图项目执行单击事件。我需要参考代码的解释。 请帮我做到这一点。 提前谢谢。 这是我的代码供您参考。

class CustomAdapter(val readerList: ReaderResponse, mainActivity: 
MainActivity,val btnlistener: BtnClickListener) : 
RecyclerView.Adapter<CustomAdapter.ViewHolder>() {

companion object {
var mClickListener: BtnClickListener? = null
}
override fun onCreateViewHolder(viewgroup: ViewGroup, index: Int): ViewHolder 
{
val view=LayoutInflater.from(viewgroup?.context).inflate(R.layout.reader_list,viewgroup,false)
return ViewHolder(view)
}
override fun getItemCount(): Int {
return readerList.results.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
mClickListener = btnlistener
val item = readerList
val reader:ReaderData = readerList.results[position]
/*p0?.imageview?.text=reader.readerIcon*/
holder?.reader_status?.text=reader.readerStatus
holder?.ward_name?.text=reader.wardName
holder?.reader_id?.text=reader.readerID
holder?.reader_name?.text=reader.readerName
holder?.reader_location?.text=reader.readerLocation

if (reader.readerStatus.toLowerCase().equals("yes")){
holder.reader_name.setTextColor(Color.parseColor("#24a314"))
}else if (reader.readerStatus.toLowerCase().equals("no")){
holder.reader_name.setTextColor(Color.parseColor("#f4312d"))
holder.warning.setVisibility(View.VISIBLE)
}
}

class ViewHolder(itemView: View) :RecyclerView.ViewHolder(itemView) {
val imageview = itemView.findViewById(R.id.imageview) as Button
val reader_name = itemView.findViewById(R.id.reader_name) as TextView
val reader_location = itemView.findViewById(R.id.floor_no) as TextView
val ward_name = itemView.findViewById(R.id.ward_name) as TextView
val reader_id = itemView.findViewById(R.id.reader_id) as TextView
val reader_status = itemView.findViewById(R.id.reader_status) as TextView
val warning=itemView.findViewById(R.id.warning) as Button


}
open interface BtnClickListener {
fun onBtnClick(position: Int)
}
}

您可以使用以下方法。这是从安东尼奥·莱瓦的博客中摘录的

假设您的数据类ReaderData

class CustomAdapter(val readers: List, val listener: (ReaderData) -> Unit) {
/* Other methods */
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
/*...*/
holder.imageview.setOnClickListener { 
listener(readers[position]) 
}
}
}

现在在您的活动或片段中

recyclerview.adapter = CustomAdapter(readersList) { readerData ->
Log.i(TAG, "${readerData.readerID} clicked")
}

这个想法是你传递一个lambda,当你想要的项目被点击时,它将被执行。

您只需要在初始化此适配器的相应活动中实现 BtnClickListener。一旦你实现了BtnClickListener,它将覆盖活动中的函数onBtnClick。 在适配器中,您唯一需要做的就是在您需要的元素上初始化 onClickListener,在该方法中只需调用imageview.setOnClickListener { mClickListener?。onBtnClick(position( }.它会将职位发送回活动状态,您可以在那里执行您的特定任务。例如,我已经在一个活动中实现了 ClickListener 并在那里打印了日志,它工作正常。下面是它的演示代码。

class Main2Activity : AppCompatActivity(), CustomAdapter.BtnClickListener {
override fun onBtnClick(position: Int) {
Log.d("Position", position.toString())
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
recyclerView.layoutManager = LinearLayoutManager(this, LinearLayout.VERTICAL, false)
val readerResponseList = ArrayList<YourModelClassName>()
val adapter = CustomAdapter(readerResponseList,this,this)
recyclerView.adapter = adapter
}

希望对您有所帮助。

最新更新