Android 拖放到listview上,如何获取拖放到的项目位置
我有一个项目列表,当项目被拖动时,它可以被放到另一个项目列表视图中的项目上 我已经有了要拖动的项的id,我需要以某种方式找出该项被拖放到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:{
@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