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

时间:2017-09-06 13:08:36

标签: android kotlin adapter baseadapter

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

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

3 个答案:

答案 0 :(得分:8)

请检查此代码,它对我来说没问题。

首先创建适配器类。

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)
                }
            })

答案 1 :(得分:3)

在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"} })

编辑:由于Asker希望看到一个完整的工作代码,我使用了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) 
})

答案 2 :(得分:0)

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

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)
            }
        })
    }
}

希望对您有所帮助!