RecyclerView多种方法为Adapter设置点击事件

2023-11-09

方法一:在Adapter单独设置

AdapteronCreateViewHolder或者onBindViewHolder单独为每个组件设置点击事件,两处都可以,但推荐在onBindViewHolder实现。

方法二:提供自定义接口

上一种方法有一个明显的缺点:如果点击的逻辑需要在Activity或者Fragment使用就会变得麻烦,比如长按弹出一个Dialog然后进行逻辑处理,这种情况下把逻辑放在Adapter绝对不是明智之选。

实现思路:在Adapter提供接口,由外部实现


  1. 首先在Adapter声明一个接口,里面提供等待实现的回调函数
  2. 声明一个延迟初始化接口变量
  3. 设置一个函数用以设置接口(用来给第二步的变量赋值)
  4. 通过view自带的setOnClickListenersetOnLongClickListener的回调函数调用接口的函数,实现回调的效果。实现哪种按照需求,这里我同时实现了两个。
  5. 最后一步,调用自定义的setOnItemClickListener并实现自己的回调逻辑
/*为节省篇幅,删去了无关代码*/
/*adapter类*/{
    /*步骤2的接口变量*/
    private lateinit var onItemClickListener: OnItemClickListener

    /*调用接口回调*/
    override fun onBindViewHolder(holder: mViewHolder, position: Int) {
        /*步骤4,实现接口回调*/
        if (this::onItemClickListener.isInitialized)/*判断lateinit var是已经初始化*/
            onItemClickListener.let {
                holder.cell.apply {
                    setOnClickListener {
                        onItemClickListener.onClick(it, position)
                    }
                    setOnLongClickListener {
                        onItemClickListener.onLongClick(it, position)
                        true
                    }
                }
            }
    }

    /*步骤3的函数*/
    fun setOnItemClickListener(onItemClickListener: OnItemClickListener){
        this.onItemClickListener=onItemClickListener
    }

    /*步骤1的接口*/
    interface OnItemClickListener {
        fun onClick(view: View, position: Int)
        fun onLongClick(view: View, position: Int)
    }
}
/*adapter外实现接口*/
madapter.setOnItemClickListener(object :ChannelAdapter.OnItemClickListener{
            override fun onClick(view: View, position: Int) {
            }
            override fun onLongClick(view: View, position: Int) {
            }
        })

方法三:使用回调

可以使用RxJava、LiveData等……思路和上一种方法相同

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RecyclerView多种方法为Adapter设置点击事件 的相关文章

随机推荐