是否可以将项目拖到 RecyclerView 之外?

Posted

技术标签:

【中文标题】是否可以将项目拖到 RecyclerView 之外?【英文标题】:Is it possible to drag an item outside of RecyclerView? 【发布时间】:2016-10-06 03:52:15 【问题描述】:

当我将一个项目从另一个 RecyclerView 拖放到它上面时,我需要以某种方式通知 RecyclerView

有可能吗? 还是应该使用经典的Drag and drop framework?

带有蓝色项目的RecyclerView 在一个片段中,带有红色项目的RecyclerView 在另一个片段中。

我也尝试过使用ItemTouchHelper,但它是来自ItemTouchHelper.Callback 的onMove() 方法在与外面的项目一起移动时不会被调用 来自RecyclerView

private class CustomItemTouchCallback extends Callback 

    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) 
        return makeMovementFlags(UP|DOWN|START|END, 0);
    

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) 
        android.util.Log.d(TAG, "Move item  from:" + viewHolder.getAdapterPosition() + " to: " + target.getAdapterPosition());
        return true;
    

    @Override
    public void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, int fromPos, RecyclerView.ViewHolder target, int toPos, int x, int y) 
        android.util.Log.d(TAG, "Moved item  from:" + fromPos + " to: " + toPos + " x: " + x + " y: " + y);
        super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y);
    

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) 

    

    @Override
    public boolean isLongPressDragEnabled() 
        return true;
    

    @Override
    public boolean isItemViewSwipeEnabled() 
        return false;
    

我也找到了这个question,但它并没有解决我的问题。

【问题讨论】:

@maratus 我想使用相同的功能你找到解决方案了吗? 你最后做了什么? 由于 RecyclerView 提供OnItemTouchListener 来处理触摸事件,理论上您需要实现的是创建与新回收器视图相同的项目,并通过编码将其从前一个视图中删除为所需的运动事件。它可能不是您想要的,但原则上是相同的功能。 我也陷入了困境,你有解决方案吗? 你检查this了吗,这是一个老问题,但似乎是同一个问题! 【参考方案1】:

老问题,但还没有答案,所以我提供一个简短的...

要将某些内容从一个视图拖到另一个视图,您可以使用DragShadowBuilderItemTouchHelper 仅用于在 RecyclerView 中移动项目,您需要自定义实现来满足您的需求。

查看此文档:https://developer.android.com/guide/topics/ui/drag-drop(所以是的,你想要的应该是这个经典的拖放框架,正如你所说的那样)

它向您展示了如何创建阴影、如何移动它(自动完成)以及如何对第二个视图中的拖动事件做出反应。

工作流程如下:

    创建拖动阴影时,例如长按RecyclerView 1 中的项目(这是项目的副本,绘制在应用上) 阴影可以移动,已经由框架处理;这将在它被拖动的视图上调用拖动进入/退出和拖动事件 在第二个RecyclerView 上添加View.OnDragListener 并处理事件(例如,如果用户将数据放在第二个RecyclerView 上并从第一个RecyclerView 中删除,则在第二个RecyclerView 中添加数据)

DragShadowBuilder 的帮助下,您可以找到这方面的教程,例如这里的那个:http://www.vogella.com/tutorials/AndroidDragAndDrop/article.html

【讨论】:

以上是关于是否可以将项目拖到 RecyclerView 之外?的主要内容,如果未能解决你的问题,请参考以下文章

在 Recyclerview 之外拖放视图

Android recyclerview拖拽自定义功能

RecyclerView 拖放喜欢 - 文件和文件夹

在 OSX 中将子视图拖到超级视图之外

使用jQuery可拖动将项目拖动到可滚动的div之外

如何自动确定 RecyclerView 网格的项目适合计数