Android RecyclerView 卡片菜单按钮 onClick 没有被 SelectionTracker 触发
Android RecyclerView card menu button onClick not triggered with SelectionTracker
上下文
我有一个 RecyclerView
卡的列表,可以通过单击来选择它们。我正在使用 SelectionTracker
和 ItemDetailsLookup
来跟踪选择了哪些卡片。一切正常。
现在我在卡片的右上角添加了一个溢出上下文菜单按钮。但是当我点击菜单按钮时,卡片变成 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")
上下文
我有一个 RecyclerView
卡的列表,可以通过单击来选择它们。我正在使用 SelectionTracker
和 ItemDetailsLookup
来跟踪选择了哪些卡片。一切正常。
现在我在卡片的右上角添加了一个溢出上下文菜单按钮。但是当我点击菜单按钮时,卡片变成 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")