使用 ItemTouchHelper 在 RecyclerView 中悬停事件

Hover event in RecyclerView using ItemTouchHelper

我有一个 RecyclerView 并使用 ItemTouchHelperItemTouchHelper.Callback 实现了拖放功能。

ItemTouchHelper.Callback 中,我有回调方法 onMove() 在将拖动的视图拖动到目标视图上并完成交换后调用该方法。

我试图实现(或找到)的是一个新的回调,当拖动的视图在目标视图上方时,在进行交换之前调用该回调。正如您在下面的 GIF 中看到的那样。

有什么办法可以实现吗? 谢谢!

在交换之前,您可以在此处放置对话框或条件,成功后您可以交换位置。

@Override
public boolean onItemMove(int fromPosition, int toPosition) {
    if (fromPosition < toPosition) {
        for (int i = fromPosition; i < toPosition; i++) {
            Collections.swap(mItems, i, i + 1);
        }
    } else {
        for (int i = fromPosition; i > toPosition; i--) {
            Collections.swap(mItems, i, i - 1);
        }
    }
    notifyItemMoved(fromPosition, toPosition);
    return true;
}

我还没有测试过,但希望这会有所帮助

我找到了我提出的问题的解决方案,所以我要 post 在这里。

ItemTouchHelper.Callback has a method called choseDropTarget() 从拖动视图下的 ViewHolders 列表中选择一个放置目标,并在拖动视图时多次调用它。 这里我们有信息来计算拖动视图何时悬停在下方视图以及何时停止悬停。

@Override
public RecyclerView.ViewHolder chooseDropTarget(RecyclerView.ViewHolder selected, List<RecyclerView.ViewHolder> dropTargets, int curX, int curY) {
    for (RecyclerView.ViewHolder target : dropTargets) {
            int top = curY - selected.itemView.getTop();
            int bottom = curY + selected.itemView.getHeight();
            int diff;
            if (top < 0) {
                diff = target.itemView.getTop() - curY;
            } else {
                diff = target.itemView.getBottom() - bottom;
            }
            if (Math.abs(diff) <= 100) {
                adapter.onItemHover();
            } else {
                adapter.onItemHoverFinish();
            }
    }
    return super.chooseDropTarget(selected, dropTargets, curX, curY);
}

该方法计算拖动视图和底部视图之间的偏移差,如果差值小于 100,则调用回调 onItemHover(),否则 onItemHoverFinished()

如果您对这个问题有更优雅的方法,请告诉我。谢谢!