在打开的PopupWindow中拦截来自RecyclerView的动作事件

问题描述 投票:0回答:1

在我的情况下,我想通过长按PopupWindow项目打开ViewHolder并在此窗口中处理运动事件而不删除手指。我怎样才能做到这一点?

我试图通过以下方式打开CustomPopupWindow

override fun onBindViewHolder(holder: Item, position: Int) {
    val item = items[position]
    holder.bindView(testItem)
    holder.itemView.view.setOnLongClickListener {    
        val inflater = LayoutInflater.from(parent?.context)
        val view = inflater.inflate(R.layout.popup_window, null)
        val popupMenu = CustomPopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
        popupMenu.elevation = 5f
        popupMenu.showAsDropDown(holder.itemView.view)
        true
    }
}

然后在RecyclerView中禁用滚动:

class CustomLayoutManager(context: Context) : LinearLayoutManager(context) {

    var scrollEnabled: Boolean = true

    override fun canScrollVertically(): Boolean {
        return scrollEnabled
    }
}

在这里我的CustomPopupWindow

class CustomPopupWindow(contentView: View?, width: Int, height: Int) : PopupWindow(contentView, width, height), View.OnTouchListener {

    init {
        contentView?.setOnTouchListener(this)
        setTouchInterceptor(this)
    }

    override fun onTouch(v: View?, event: MotionEvent?): Boolean {
        when (event?.action) {
            MotionEvent.ACTION_DOWN -> {
                Log.i("Touch", "Touch")
            }
            MotionEvent.ACTION_MOVE -> {
                Log.i("Touch", "Event {${event.x}; ${event.y}}")
            }
            MotionEvent.ACTION_UP-> {
                Log.i("Touch", "Up")
            }
        }
        return true
    }
}

在这种情况下,onTouch()事件从未在CustomPopupWindow中调用,只有当我移除手指并再次点击时。

谢谢提前!

解决了

我通过向锚点视图添加触摸侦听器来解决这个问题:

holder.itemView.view.setOnLongClickListener {    
    val inflater = LayoutInflater.from(parent?.context)
    val view = inflater.inflate(R.layout.popup_window, null)
    val popupMenu = CustomPopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
    popupMenu.elevation = 5f
    it.setOnTouchListener(popupMenu) // solution
    popupMenu.showAsDropDown(it)
    true
}

谢谢@Brucelet

android android-recyclerview kotlin popupwindow motionevent
1个回答
0
投票

如果你可以重构使用PopupMenu,那么我认为PopupMenu.getDragToOpenListener()会做你想要的。类似于ListPopupWindow.createDragToOpenListener()

您还可以查看这些方法的实现,以便在创建自己的方法时获得灵感。

© www.soinside.com 2019 - 2024. All rights reserved.