我有一个项目列表,当项目被拖动时,它可以被拖放到另一个项目列表视图中的项目上。
我已经有了被拖动项目的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>
答案 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来获取项目。