回收器查看项目触摸帮助程序操作拖动结束



当用户停止在我的RecyclerView上拖放时(当他放下所选项目时),我需要倾听用户的声音。

我可以通过我的 ItemTouchHelper 获取此信息吗?

感谢您的帮助

Mark:目前我只有当用户仍然将项目移动到:)

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
    if (source.getItemViewType() != target.getItemViewType()) {
        return false;
    }
    // Notify the adapter of the move
    mAdapter.onItemMove(source.getAdapterPosition(), target.getAdapterPosition());
    return true;
}

更新

首先,您可以通过实现canDropOver来定义可以放置对象的位置

@Override
public boolean canDropOver(RecyclerView recyclerView, RecyclerView.ViewHolder current, RecyclerView.ViewHolder target) {
    return current.getItemViewType() == getItemViewType();
}

更新要使用的适配器onMove这可以在拖动操作期间调用多个

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
    adapter.moveItem(viewHolder.getAdapterPosition(), target.getAdapterPosition());
    return true;
}

要检测与元素的交互何时过度实现clearView这是针对任何操作类型(拖动或滑动),即使它成功(项目移动或滑动)或被取消(项目未移动或滑动)

@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    super.clearView(recyclerView, viewHolder);
    // Action finished
}

您可以在 ItemTouchHelper.Callback() 的实现中覆盖 onSelectedChange,例如:

 override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
        super.onSelectedChanged(viewHolder, actionState)
        when (actionState) {
            ItemTouchHelper.ACTION_STATE_DRAG ->
                Log.d("DragTest","Start to drag: $actionState")
            ItemTouchHelper.ACTION_STATE_SWIPE ->
                Log.d("DragTest","Start to swipe: $actionState")
            ItemTouchHelper.ACTION_STATE_IDLE -> {
                Log.d("DragTest","End action: $actionState")
            }
        }
    }

使用onSelectedChanged的简单解决方案。使用拖动标志仅在拖动时做出反应,而不是滑动。

new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

           boolean drag = false;

           @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
               
                // YOUR onMove
                return false;
            }

            @Override
            public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {
                super.onSelectedChanged(viewHolder, actionState);
                if(actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
                    drag = true;
                    Log.d("DragTest","DRAGGGING start");                   
                }
                if(actionState == ItemTouchHelper.ACTION_STATE_IDLE && drag) {
                    Log.d("DragTest","DRAGGGING stop");
                    drag= false;
                }
             }
            
        }).attachToRecyclerView(mRecyclerView);

最新更新