如何使用界面android在适配器中创建onclick事件?

如何使用界面创建点击事件?

在我的应用程序中,我创建了视图单击界面来检测将适配器项目单击到父活动中。 创建接口和方法到适配器后,如何使用此接口来调用视图侦听器?

请检查这个代码,这对我来说工作得很好。

首先创建Adapter类。

class ChapterAdapter(private val activity: Activity, val mWords: ArrayList<Chapter>, val btnlistener: BtnClickListener) : RecyclerView.Adapter<ChapterAdapter.ViewHolder>() { companion object { var mClickListener: BtnClickListener? = null } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val layoutInflater = LayoutInflater.from(parent.context) return ViewHolder(layoutInflater.inflate(R.layout.layout_capter_raw, parent, false)) } override fun onBindViewHolder(holder: ViewHolder?, position: Int) { mClickListener = btnlistener val item = mWords[position] holder.layout_chapter_name.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View?) { if (mClickListener != null) mClickListener?.onBtnClick(position) } }) } override fun getItemCount(): Int { return mWords.size } override fun getItemId(position: Int): Long { return super.getItemId(position) } override fun getItemViewType(position: Int): Int { return super.getItemViewType(position) } class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val txt_capter_name = view.txt_capter_name } open interface BtnClickListener { fun onBtnClick(position: Int) } } 

在你的Activity或Fragment中创建和声明适配器之后。

 listAdapter = ChapterAdapter(activity, _arrChapterList, object : ChapterAdapter.BtnClickListener { override fun onBtnClick(position: Int, chapter_id: String, chapter_size: String, chapter_name: String) { toast(chapter_id + " = " + chapter_size, Toast.LENGTH_LONG) } }) 

在Kotlin中,正确的做法是使用回调代替Java Interfaces 。 例:

 class MyAdapter(private val callback: (YourModel) -> Unit) { override fun onBindViewHolder(holder: DataBoundViewHolder<YourModel>, position: Int) { bind(holder.binding, items!![position]) holder.binding.executePendingBindings() holder.binding.root.setOnClickListener { callback(binding.model) } } } 

并使用创建适配器的地方

 MyAdapter myAdapter = MyAdapter( { println{"Clicked $it"} }) 

编辑:由于阿斯克尔希望看到一个完整的工作代码,我使用了来自Sumit的代码,并用Kotlin-Callbacks代替了接口。

 class ChapterAdapter(private val activity: Activity, val mWords: ArrayList<Chapter>, val callback: (Any) -> Unit) : RecyclerView.Adapter<ChapterAdapter.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val layoutInflater = LayoutInflater.from(parent.context) return ViewHolder(layoutInflater.inflate(R.layout.layout_capter_raw, parent, false)) } override fun onBindViewHolder(holder: ViewHolder?, position: Int) { val item = mWords[position] holder.layout_chapter_name.setOnClickListener( callback {$it}) } override fun getItemCount(): Int = mWords.size override fun getItemId(position: Int): Long = super.getItemId(position) override fun getItemViewType(position: Int): Int = super.getItemViewType(position) class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val txt_capter_name = view.txt_capter_name } 

最后创建Adapter

 listAdapter = ChapterAdapter(activity, _arrChapterList, { toast( "Clicked $it", Toast.LENGTH_LONG) })