拖放到列表视图上,如何获取放置的项目位置
Posted
技术标签:
【中文标题】拖放到列表视图上,如何获取放置的项目位置【英文标题】:Dragging and dropping onto a listview, how to get the item position that was dropped on 【发布时间】:2017-12-06 16:31:48 【问题描述】:我有一个项目列表,当项目被拖动时,它可以被拖放到另一个项目列表视图中的项目上。
我已经有了被拖动项目的 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 中可能有一些我丢失的数据,或者不支持拖放以将项目拖放到列表视图上?
我认为问题的一部分是片段本身正在捕获拖动,但它没有将其传递到列表视图项,如果有某种方式将拖动传递到子视图,它可能会起作用。
【问题讨论】:
【参考方案1】:所以最后我关于将拖动传递到列表视图的想法似乎有些正确,在我的父片段中我执行以下操作:
@Override
public boolean onDrag(View v, DragEvent event)
listView.onDragEvent(event);
return true;
您还需要像这样向列表视图本身添加一个拖动侦听器:
listView.setOnDragListener(new View.OnDragListener()
@Override
public boolean onDrag(View v, DragEvent event)
return true;
);
然后在列表视图的适配器中,将片段作为参数传递给构造函数(我相信 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;
);
最终的结果是您可以像往常一样使用列表视图适配器以及可用于抓取 ClipData 的 DragEvent 来获取项目。
【讨论】:
以上是关于拖放到列表视图上,如何获取放置的项目位置的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Mac OS X 上获取拖放到应用程序二进制文件中的文件列表? [关闭]