Android 从“回收”拖放到另一个视图

Android 从“回收”拖放到另一个视图,android,kotlin,Android,Kotlin,我需要帮助。我有这样一个案子 我需要释放拖放功能从回收到我的自定义视图。我的自定义视图是一个包含四个其他视图的容器。此视图有两种类型:空视图和包含回收项目的视图。当用户从回收器拖动项目时,我需要更改容器中某个视图的背景颜色,当我拖动的视图在视图边界内移动时。所以我知道OnDragListener只在父视图中处理事件。然后,我为recycler中的项目和容器视图编写了两个OnDragListener,如下所示: interface DragItemListener { fun on

我需要帮助。我有这样一个案子

我需要释放拖放功能从回收到我的自定义视图。我的自定义视图是一个包含四个其他视图的容器。此视图有两种类型:空视图和包含回收项目的视图。当用户从回收器拖动项目时,我需要更改容器中某个视图的背景颜色,当我拖动的视图在视图边界内移动时。所以我知道OnDragListener只在父视图中处理事件。然后,我为recycler中的项目和容器视图编写了两个OnDragListener,如下所示:

interface DragItemListener {
        fun onDragItem(item: item?)
}


class DragController(val item: Item) : OnDragListener {

        override fun onDrag(v: View, event: DragEvent): Boolean {

            val action = event.action

            when (action) {
                DragEvent.ACTION_DRAG_STARTED -> {
                    dragItemListener?.onDragItem(item)
                }
                DragEvent.ACTION_DROP -> {
                    dragItemListener?.onDragItem(null)
                }
            }

            return true
        }

    }


class MyCustomContainer(context: Context) : LinearLayout(context) {

init {
   this.setOnDragListener(DraggingItemListener())
}

fun setDraggableElement(item: Item?) {
   this.draggedItem = item
}

private fun findItemView(x: Float, y: Float) : View?{

        (0 until childCount).map { getChildAt(it) }.forEach { 
            if (it is EmptyView || it is ItemView) {
                val bounds = getViewBounds(it)

                if (x > bounds.left && x < bounds.right && y > bounds.top && y < bounds.bottom){
                    it.setBackgroundResource(R.color.selected_background)
                    return it
                }else {
                    it.setBackgroundResource(R.color.background)
                }
            }
        }
        return null
} 

private fun getViewBounds(view: View) : Rect{
        return Rect(view.left, view.top, view.left + view.width, view.top + view.height)
}

inner class DraggingItemListener : OnDragListener {

        private var currentView: View? = null

        override fun onDrag(v: View?, event: DragEvent): Boolean {
            if (draggedItem != null) {

                when(event.action) {

                    DragEvent.ACTION_DRAG_LOCATION -> {
                        currentView = findItemView(event.x, event.y)
                    }
                    DragEvent.ACTION_DROP -> {
                        when(currentView) {
                            is EmptyView -> {

                            }
                            is ItemView -> {

                            }
                        }
                    currentView?.setBackgroundResource(R.color.background)
                    currentView = null
                    }
            }else{
                currentView = null
            }
            return true
        }

    }

}
接口DragItemListener{
有趣的物品(物品:物品?)
}
类DragController(val项:项):OnDragListener{
重写数据集(v:View,event:DragEvent):布尔值{
val action=event.action
何时(行动){
DrageEvent.ACTION\u DRAG\u已启动->{
dragItemListener?.onDragItem(项目)
}
DrageEvent.ACTION_DROP->{
dragItemListener?.onDragItem(空)
}
}
返回真值
}
}
类MyCustomContainer(上下文:上下文):LinearLayout(上下文){
初始化{
this.setOnDragListener(DraggingItemListener())
}
趣味SetDragableElement(项目:项目?){
this.draggedItem=项目
}
私人娱乐findItemView(x:Float,y:Float):视图{
(0直到childCount).map{getChildAt(it)}.forEach{
if(它是空视图| |它是项目视图){
val bounds=getViewBounds(it)
if(x>bounds.left&&xbounds.top&&y{
currentView=findItemView(event.x,event.y)
}
DrageEvent.ACTION_DROP->{
何时(当前视图){
是空视图->{
}
是ItemView->{
}
}
currentView?.setBackgroundResource(R.color.background)
currentView=null
}
}否则{
currentView=null
}
返回真值
}
}
}
这是解决我的问题的正确方法还是我错了?但它工作正常