簡體   English   中英

如何知道用戶何時完成移動 RecyclerView 項目?

[英]How to know when user is done moving a RecyclerView item?

當用戶丟棄物品時,我需要執行某些操作。 ItemTouchHelper 似乎只調用 onMove 和 onMoved ,無論用戶是否實際完成移動項目。 我如何知道用戶何時完成移動項目? 即,他們已經松開手指並將項目放回recyclerView?

您可以覆蓋ItemTouchHelper.Callback class 實現的onSelectedChanged()回調,並使用可以是( ACTION_STATE_DRAGACTION_STATE_SWIPEACTION_STATE_IDLE )之一的開關情況檢查actionState值。

ACTION_STATE_IDLE是您要查找的內容,當滑動/拖動操作結束並且用戶將手指離開屏幕時將觸發它

您可以使用 boolean 來確定它是滑動還是拖動,如下所示。

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

    });
}

然后在你的RecyclerView上使用它

createHelperCallback().attachToRecyclerView(recyclerView);

預習

簡單的。 只需覆蓋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();
}

您還可以覆蓋getAnimationDuration() ,它在onSelectedChanged()之前調用(就在用戶手指抬起時),但您無法訪問此viewHolder中的 viewHolder。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM