为什么我的拖放操作会从RecyclerView失败?

时间:2015-08-28 08:17:50

标签: android drag-and-drop

我的总体目标是能够将一行从RecyclerView拖到我应用内的另一个视图。

使用带有LinearLayoutmanager的标准RecyclerView,没有额外的mumbo-jumbo,我的拖放操作完美无瑕。但是,只要我引入一个名为AndroidSwipeLayout的自定义库来使每一行都可以移动以显示额外的操作,一切都会失败并且我得到常见的错误:

08-28 09:59:03.465: I/ViewRootImpl(15310): Reporting drop result: false

此外,我可以看到在我的接收视图中触发的唯一DragEvent是ACTION_DRAG_STARTEDACTION_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

我确定这不是特定于这个库的,但是当列表中的每个视图都有太多的手势检测时会出现问题。我认为图书馆非常优秀,我不想自己编写这种互动。

欢迎并赞赏任何想法或评论。即使你不知道确切的解决方案。

感谢。

1 个答案:

答案 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