拖放到列表视图,如何获取

时间:2017-07-03 11:57:46

标签: android listview drag-and-drop

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

我已经有了被拖动项目的ID,我需要以某种方式找出列表视图中哪个项目被删除,以便我可以从适配器获取该位置的对象。

以下是我目前的尝试:

@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;
    }

遗憾的是,这不起作用,因为event.getLocalState()从最初拖动的位置返回视图,而不是拖动它的位置。

视图v似乎是整个应用的FrameLayout,所以也没用。

我认为DragEvent中可能存在一些我缺少的数据,或者只是不支持将项目拖放到列表视图上?

我认为问题的一部分是片段本身正在捕获拖拽,但它没有将它传递给listview项目,如果有某种方式将拖拽传递给它可能有效的子视图。 / p>

1 个答案:

答案 0 :(得分:0)

所以最后关于将拖拽传递给listview的想法似乎有些正确,在我的父片段中我做了以下几点:

@Override
    public boolean onDrag(View v, DragEvent event) {
        listView.onDragEvent(event);
        return true;
    }

您还需要向listview本身添加一个拖动侦听器,如下所示:

listView.setOnDragListener(new View.OnDragListener() {
            @Override
            public boolean onDrag(View v, DragEvent event) {
                return true;
            }
        });

然后在listview的适配器中,将片段作为参数传递给构造函数(我相信getCallingActivity()将为活动执行此任务),并执行以下操作:

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适配器以及可用于获取ClipData的DragEvent来获取项目。