Android RecyclerView 卡片菜单按钮 onClick 没有被 SelectionTracker 触发

Android RecyclerView card menu button onClick not triggered with SelectionTracker

上下文

我有一个 RecyclerView 卡的列表,可以通过单击来选择它们。我正在使用 SelectionTrackerItemDetailsLookup 来跟踪选择了哪些卡片。一切正常。

现在我在卡片的右上角添加了一个溢出上下文菜单按钮。但是当我点击菜单按钮时,卡片变成 de/selected。我想要的是让按钮 onClickListener 触发菜单弹出窗口。

请帮忙,我错过了什么?

片段

class ProductsFragment : Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {

        val tracker = SelectionTracker.Builder( ... ).build()
        adapter.tracker = tracker
        tracker.addObserver(
            object : SelectionTracker.SelectionObserver<String>() {
                override fun onSelectionChanged() { ... }
            }
        )
    }
}

RecyclerView.Adapter

class ProductsAdapter : RecyclerView.Adapter<ProductsAdapter.ViewHolder>() {
    var tracker: SelectionTracker<String>? = null

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val product= products[position]
        holder.menuButton.setOnClickListener {
            showMenu(holder)
        }
    }

    inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val menuButton: MaterialButton = view.findViewById(R.id.menu)
        fun getItemDetails(): ItemDetails<String> = object : ItemDetails<String>() {
                override fun getPosition(): Int = absolutePosition
                override fun getSelectionKey(): String = getItem(absolutePosition).product.id.toString()
            }
}

在ViewHolder内部添加如下内容class:

init {
    menuButton.setOnTouchListener { v, _ ->
        v.parent.requestDisallowInterceptTouchEvent(true)
        false
    }
}

Android 工作室将发出警告:onTouch lambda should call View#performClick when a click is detected。您可以通过在 ViewHolder class 定义之前添加以下注释来抑制这种情况:

@SuppressLint("ClickableViewAccessibility")