如何知道用户何时完成移动 RecyclerView 项目?

Ben*_*ora 5 android android-recyclerview itemtouchhelper

当用户删除某个项目时,我需要执行一些操作。ItemTouchHelper 似乎只调用 onMove 和 onMoved,无论用户是否真正完成了项目的移动,这些调用都会发生。我如何知道用户何时完成移动项目?即,他们已经松开手指并将项目放回到 recyclerView 中?

Zai*_*ain 7

您可以覆盖类onSelectedChanged()实现的回调ItemTouchHelper.Callback,并使用可以是 ( 、、 & )actionState之一的 switch case 检查值。ACTION_STATE_DRAGACTION_STATE_SWIPEACTION_STATE_IDLE

ACTION_STATE_IDLE是您正在寻找的内容,当滑动/拖动操作结束并且用户将手指离开屏幕时会触发它

您可以使用布尔值来确定是滑动还是拖动,如下所示。

private ItemTouchHelper createHelperCallback() {
    return new ItemTouchHelper(new ItemTouchHelper.Callback() {

        boolean isSwiped = false;

        @Override
        public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
            return 0;
        }

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

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

        @Override
        public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {

            switch (actionState) {

                case ItemTouchHelper.ACTION_STATE_DRAG:
                    // the user is dragging an item and didn't lift their finger off yet
                   isSwiped = false;
                   break;

                case ItemTouchHelper.ACTION_STATE_SWIPE:
                    // the user is swiping an item and didn't lift their finger off yet
                    isSwiped = true;
                    break;

                case ItemTouchHelper.ACTION_STATE_IDLE:
                    // the user just dropped the item (after dragging it), and lift their finger off.

                    if (isSwiped) // The user used onSwiped()
                        Toast.makeText(MainActivity.this, "Swiping is over", Toast.LENGTH_SHORT).show();
                        
                    else // The user used onMove()
                        Toast.makeText(MainActivity.this, "Dragging & Dropping are over", Toast.LENGTH_SHORT).show();
                    isSwiped = false;
                
            }
        }

    });
}
Run Code Online (Sandbox Code Playgroud)

然后将其用在您的RecyclerView

createHelperCallback().attachToRecyclerView(recyclerView);
Run Code Online (Sandbox Code Playgroud)

预览


Sam*_*hen 3

简单的。只需覆盖onClearView()

@Override
public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {    //called when you dropped the item
    super.clearView(recyclerView, viewHolder);

    Toast.makeText(recyclerView.getContext(), "Item dropped on position: " + viewHolder.getAdapterPosition(), Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)