如何为 recyclerView 上的两个不同事件设置监听器?

Posted

技术标签:

【中文标题】如何为 recyclerView 上的两个不同事件设置监听器?【英文标题】:How to set listener for two diferent events on recyclerView? 【发布时间】:2021-02-16 08:57:38 【问题描述】:

我正在尝试在我的 recyclerview 适配器上为 cardview 实现两个不同的侦听器。我想我必须使用元素 id 来处理事件,但我不知道该怎么做。这是我的适配器视图持有者,我在其中调用其中一个侦听器并且工作正常。

class ProductListViewHolder(itemView: View, listener: OnItemClickListener ) : RecyclerView.ViewHolder(itemView) 

    var lytProductInfo: LinearLayout? = null
    var btnAddProduct: Button? = null

    init 
        
        lytProductInfo = itemView.findViewById(R.id.lytProductInfo)
        btnAddProduct = itemView.findViewById(R.id.btnAddProduct)

        lytProductInfo!!.setOnClickListener(View.OnClickListener 
            if (itemView.hasFocus()) 
                itemView.clearFocus()
                //hide keyboard when item has been clicked
                if (itemView is EditText) 
                    val imm = itemView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                    imm.hideSoftInputFromWindow(itemView.getWindowToken(), 0)
                
            
            val position = adapterPosition
            if (position != RecyclerView.NO_POSITION) 
                //click function
                listener.onClick(position)
            
        )
    

这就是我在课堂上的称呼

productListAdapter!!.setOnItemClickListener( object: ProductListAdapter.OnItemClickListener 
            override fun onClick(position: Int) 
                val saleId = productList[position].idProduct
            

        override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) 
            val saleId = productList[position].idProduct
        
    )

第二个监听器来自 btnAddProduct。

我该怎么做?

【问题讨论】:

你想从你的基类中检测对适配器的点击吗? 感谢您的回复。是的,因为我对事件有更多的控制权 【参考方案1】:

在你的适配器类上实现这个

interface OnItemClickListener : AdapterView.OnItemClickListener 
        fun onInformationClicked(position: Int, v: View?)
        fun onAddClicked(position: Int, v: View?)
    

然后在你的viewholder上

lytProductInfo!!.setOnClickListener(View.OnClickListener  v ->
                val position = adapterPosition
                if (position != RecyclerView.NO_POSITION) 
                    listener.onInformationClicked(position, v)
                
            )

        btnAddProduct!!.setOnClickListener(View.OnClickListener  v ->
            val position = adapterPosition
            if (position != RecyclerView.NO_POSITION) 
                listener.onAddClicked(position, v)
            
        )

然后在你的父类上

productListAdapter!!.setOnItemClickListener( object: ProductListAdapter.OnItemClickListener 
            
        override fun onInformationClicked(position: Int, v: View?) 
            showProductInfo()
        

        override fun onAddClicked(position: Int, v: View?) 
            addProduct()
        
    )

【讨论】:

【参考方案2】:

您可以像这样从适配器创建回调, 在你的构造函数中创建一个参数,

class YourAdapter(val onYourCallback:(Int)-> Unit):RecyclerView.ViewHolder(itemView)
    
    
    

像这样在适配器中调用它,

onYourCallback(position)

你可以像这样在你的活动中接收回调,

YourAdapter()position->
 callYourFunctionHere()

【讨论】:

以上是关于如何为 recyclerView 上的两个不同事件设置监听器?的主要内容,如果未能解决你的问题,请参考以下文章

如何为传入和传出的聊天消息使用不同的布局

如何为android recyclerview中的最大字符串设置textview高度?

如何为 RecyclerView 设置 onItemClickListener? [复制]

滚动时如何为 recyclerview 项目设置动画?

CSRF 保护如何为我提供比 CORS 控制更高的安全性(前端/后端位于两个不同的域)?

如何为最后一个元素为 RecyclerView 添加边距?