我的总体目标是能够将一行从RecyclerView拖到我应用内的另一个视图。
使用带有LinearLayoutmanager的标准RecyclerView,没有额外的mumbo-jumbo,我的拖放操作完美无瑕。但是,只要我引入一个名为AndroidSwipeLayout的自定义库来使每一行都可以移动以显示额外的操作,一切都会失败并且我得到常见的错误:
08-28 09:59:03.465: I/ViewRootImpl(15310): Reporting drop result: false
此外,我可以看到在我的接收视图中触发的唯一DragEvent是ACTION_DRAG_STARTED
和ACTION_DRAG_ENDED
,所有其他事件都被跳过。正如您所看到我从true
返回ACTION_DRAG_STARTED
但这没有帮助,我的想法是自定义库以某种方式吃掉了我的事件。但我无法确定在哪里。
这是我的OnDragListener:
private class MyDropListener implements View.OnDragListener {
@Override
public boolean onDrag(View v, DragEvent event) {
// Doing some calculations based on event x and y. Not related to the problem.
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
// Some unrelated code, updating how views are displayed
return true;
case DragEvent.ACTION_DRAG_LOCATION:
// Some unrelated code, updating how views are displayed
return true;
case DragEvent.ACTION_DROP:
// Some unrelated code, updating some data and updating how views are displayed
return true;
case DragEvent.ACTION_DRAG_ENDED:
// Some unrelated code, updating how views are displayed
return true;
case DragEvent.ACTION_DRAG_ENTERED:
// Some unrelated code, updating how views are displayed
return true;
case DragEvent.ACTION_DRAG_EXITED:
// Some unrelated code, updating how views are displayed
return true;
default:
return false;
}
}
}
我已经在图书馆内进行了几天的实验,但找不到确切的解决方案。有时我设法让下降工作,但这是非常不正常的行为。
我也为这个问题提出了一个Github问题:
AndroidSwipeLayout - issue #211
我确定这不是特定于这个库的,但是当列表中的每个视图都有太多的手势检测时会出现问题。我认为图书馆非常优秀,我不想自己编写这种互动。
欢迎并赞赏任何想法或评论。即使你不知道确切的解决方案。
感谢。
答案 0 :(得分:0)
这实际上不是由库或侦听器引起的,它是由位于相同布局中的EditText引起的。
通过创建一个继承EditText并忽略dragEvent的新类来解决它。
public class EditTextNoDrag extends EditText {
public EditTextNoDrag(Context context) {
super(context);
}
public EditTextNoDrag(Context context, AttributeSet attrs) {
super(context, attrs);
}
public EditTextNoDrag(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public EditTextNoDrag(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public boolean onDragEvent(DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
return false;
default:
return super.onDragEvent(event);
}
}
}
您还可以打开和关闭EditText的焦点。 请参阅此相关的isseu:Prevent drag drop of custom mimetype to EditText