1

我有一个使用andRecyclerView实现的拖放功能。ItemTouchHelperItemTouchHelper.Callback

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

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

在此处输入图像描述

有什么想法可以实现这一目标吗?谢谢!

4

2 回答 2

1

我找到了我提出的问题的解决方案,因此我将在此处发布。

ItemTouchHelper.Callback有一个调用的方法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()否则调用。

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

于 2018-01-11T12:49:37.880 回答
0

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

@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;
}

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

于 2017-12-20T16:09:46.103 回答