如何为 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? [复制]