Android 拖放到listview上,如何获取拖放到的项目位置

Android 拖放到listview上,如何获取拖放到的项目位置,android,listview,drag-and-drop,Android,Listview,Drag And Drop,我有一个项目列表,当项目被拖动时,它可以被放到另一个项目列表视图中的项目上 我已经有了要拖动的项的id,我需要以某种方式找出该项被拖放到listview中的哪个项,以便从适配器获取该位置的对象 以下是我目前的尝试: @Override public boolean onDrag(View v, DragEvent event) { switch (event.getAction()){ case DragEvent.ACTION_DROP:{

我有一个项目列表,当项目被拖动时,它可以被放到另一个项目列表视图中的项目上

我已经有了要拖动的项的id,我需要以某种方式找出该项被拖放到listview中的哪个项,以便从适配器获取该位置的对象

以下是我目前的尝试:

@Override
    public boolean onDrag(View v, DragEvent event) {
        switch (event.getAction()){
            case DragEvent.ACTION_DROP:{
                ClipData data = event.getClipData();
                View droppedView = (View) event.getLocalState();
                Integer position = listView.getPositionForView(droppedView);
                Toast.makeText(getContext(), "ID: " + data.getItemAt(0).getText() + " Pos " + position, Toast.LENGTH_LONG).show();
            }
        }

        return true;
    }
不幸的是,这不能作为事件使用。getLocalState()返回最初从何处拖动的视图,而不是将其拖动到何处的视图

视图v似乎是整个应用程序的框架布局,因此也没有用处

我认为DrageEvent中可能有一些数据我丢失了,或者拖放不支持将项目拖放到listview上


我认为问题的一部分在于片段本身正在捕获拖动,但它没有将其传递到listview项,如果有某种方式可以将拖动传递到子视图,那么它可能会工作。

因此,最后我关于将拖动传递到listview的想法似乎有些正确,在我的父片段中,我执行以下操作:

@Override
    public boolean onDrag(View v, DragEvent event) {
        listView.onDragEvent(event);
        return true;
    }
view.setOnDragListener(new View.OnDragListener() {
            @Override
            public boolean onDrag(View v, DragEvent event) {
                switch (event.getAction()){
                    case DragEvent.ACTION_DROP:{
                        parentFragment.performAction(event, item.getId());
                    }
                }
                return true;
            }
        });
您还需要向listview本身添加一个拖动侦听器,如下所示:

listView.setOnDragListener(new View.OnDragListener() {
            @Override
            public boolean onDrag(View v, DragEvent event) {
                return true;
            }
        });
然后在listview的适配器中,将片段作为参数传递给构造函数(我相信getCallingActivity()会为活动执行此操作),并执行以下操作:

@Override
    public boolean onDrag(View v, DragEvent event) {
        listView.onDragEvent(event);
        return true;
    }
view.setOnDragListener(new View.OnDragListener() {
            @Override
            public boolean onDrag(View v, DragEvent event) {
                switch (event.getAction()){
                    case DragEvent.ACTION_DROP:{
                        parentFragment.performAction(event, item.getId());
                    }
                }
                return true;
            }
        });
最终的结果是,您可以像往常一样使用listview适配器和DrageEvent获取项目,您可以使用DrageEvent获取ClipData