在 Recyclerview 之外拖放视图

Posted

技术标签:

【中文标题】在 Recyclerview 之外拖放视图【英文标题】:Drag and Drop view outside of Recyclerview 【发布时间】:2016-05-04 12:15:29 【问题描述】:

我想要实现的目标:我希望在可滚动布局(RecyclerviewGridlayoutManager)中有一个视图,其中包含图块(视图)。在RecyclerView 中拖放一个项目应该会调整图标的位置并与其他元素交换。当拖动开始时,RecyclerView 上方的图标将变为垃圾桶图标,将视图拖动到此图标将从RecyclerView 中删除它。

我试过这个excellent tutorial,但我没有找到一种方法来处理Recyclerview 之外的拖动,因为ItemTouchHelper.Callback 仅使用Recycler.ViewHolder 元素作为可能的目标。

如果视图移出边界,interpolateOutOfBoundsScroll() 方法会给出反馈,但只会返回屏幕外的总大小,而不是坐标。此外,尝试将视图拖出Recyclerview 总是会导致视图在通过Recyclerview 边界的位置被剪切。

有谁知道我如何实现这种效果?

【问题讨论】:

【参考方案1】:

您可以通过为 RecyclerView 的父级设置此属性来实现这一点:

    android:clipChildren="false"

编辑:感谢 Adam Katz,我不知道为什么,但有时您必须将其添加到 RecyclerView 才能使其工作:

    android:clipToPadding="false"

【讨论】:

哇,我不敢相信没有人评论过这个。只是一个补充,添加 android:clipChildren="false" android:clipToPadding="false" 很有帮助 如何处理drop到回收站外的View?【参考方案2】:

您受到RecyclerView 边界的约束。您有多种选择:

    RecyclerView 的布局高度设置为match_parent 并位于您的上视图顶部(是Toolbar?)并添加一个相同大小的粘性标题并有一个空透明布局。这样你就可以拖动它并看到项目漂浮在那里。

    不要将项目拖到距离合法右上角项目太近的垃圾桶图标上,而是长按以选择项目(并应用复选标记或红色蒙版等信号) 并使垃圾可以在点击时出现并删除(并且可能允许删除多项)

【讨论】:

感谢您的回复!上视图是一个RelativeLayout,其中包含一些TextviewsImageviews 以及应该变成垃圾桶的Imageview。我喜欢你的带有粘性标题的想法。如果垃圾箱Imageview 是粘性标题中的唯一元素并且没有完全填充它,有没有办法阻止用户将视图拖到垃圾箱Imageview 行旁边的位置?我现在就试试这个 @Eve 如果目标位置在标题中,则不要交换它们 还在想这个,有没有办法像Google 的经典方法那样定义拖动阴影,所以只拖动阴影而不拖动视图本身? @Eve 你可以在顶部添加另一个视图,一旦拖动它就会变成阴影 对不起,我不确定我是否理解正确。我仍然希望通过 recyclerview 拖动一个项目,这会导致对所有元素进行排序,然后将其拖动到该视图之外的其他地方。但是如果我只拖动一个位于 recyclerview 顶部的元素,recyclerview 内的元素将不会调整/滑动到正确的位置?

以上是关于在 Recyclerview 之外拖放视图的主要内容,如果未能解决你的问题,请参考以下文章

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

在ANDROID中相互拖放时合并Recyclerview中的项目?

在 RecyclerView 中的特定位置拖放停止

RecyclerView 适配器 notifyDataSetChanged 停止花哨的动画

如何拖放 recyclerView 元素?

RecyclerView分隔线定制