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

How to create onclick event in adapter using interface android?

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

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

请检查此代码,它对我来说工作正常。

首先创建适配器class。

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
        }

最后创建适配器

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

我有同样的问题,这是我的解决方案:

package adapter

class MarketplaceListAdapter : RecyclerView.Adapter<MarketplaceListAdapter.ViewHolder> {

    private val marketplaceList: ArrayList<Marketplace>

    constructor(marketplaceList: ArrayList<Marketplace>) : super() {
        this.marketplaceList = marketplaceList
    }

    private var listener: OnItemClickListener? = null

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        // implementation
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        // implementation
    }

    override fun getItemId(position: Int): Long {
        return 0
    }

    override fun getItemCount(): Int {
        return marketplaceList.size
    }

    fun setListener(listener: OnItemClickListener) {
        this.listener = listener
    }

    interface OnItemClickListener {
        fun onItemClick(marketplace: Marketplace)
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
        View.OnClickListener {

        var tvTitle: TextView = itemView.findViewById(R.id.tvTitle)
        var ivIcon: ImageView = itemView.findViewById(R.id.ivIcon)

        init {
            itemView.setOnClickListener(this)
        }

        override fun onClick(v: View) {
            listener?.onItemClick(marketplaceList[adapterPosition])
        }

    }

}

在我的片段上:

val list = view.findViewById<RecyclerView>(R.id.list)

list?.let {
    adapter?.let { adapter ->
        list.adapter = adapter

        adapter.setListener(object : MarketplaceListAdapter.OnItemClickListener {
            override fun onItemClick(marketplace: Marketplace) {
                onMarketplaceSelected(marketplace)
            }
        })
    }
}