[Android]RecyclerViewでスワイプで項目の削除

RecyclerViewでスワプで削除をするためには、ItemTouchHelperのonSwiped / onChildDrawで以下のように記載します。

final ItemTouchHelper mItemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.LEFT) {
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        return true;
    }

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        final int index = viewHolder.getAdapterPosition();
        
        //該当のデータを削除する
        DeleteData(viewHolder.getAdapterPosition());

        //戻すためのスナックバーの表示
        Snackbar snackbar = Snackbar.make(mListView, R.string.snackbar_redo_message, Snackbar.LENGTH_LONG);
        snackbar.setAction(R.string.undo, v -> {
            //Undo処理を行う
        });
        snackbar.show();
    }

    @Override
    public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        return  ItemTouchHelper.LEFT;
    }

    @Override
    public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);

        View itemView = viewHolder.itemView;
        int backgroundCornerOffset = 20; //so background is behind the rounded corners of itemView

        int iconMargin = (itemView.getHeight() - mDeleteIcon.getIntrinsicHeight()) / 2;
        int iconTop = itemView.getTop() + (itemView.getHeight() - mDeleteIcon.getIntrinsicHeight()) / 2;
        int iconBottom = iconTop + mDeleteIcon.getIntrinsicHeight();

        if(dX == 0){
            // スワイプしないなら表示をクリアする
            mDeleteBackground.setBounds(0, 0, 0, 0);
            return;
        }

        if (dX > 0) { // 右にスワイプするときの処理
            int iconLeft = itemView.getLeft() + iconMargin + mDeleteIcon.getIntrinsicWidth();
            int iconRight = itemView.getLeft() + iconMargin;
            mDeleteIcon.setBounds(iconLeft, iconTop, iconRight, iconBottom);

            mDeleteBackground.setBounds(itemView.getLeft(), itemView.getTop(),
                    itemView.getLeft() + ((int) dX) + backgroundCornerOffset, itemView.getBottom());
        } else if (dX < 0) { 
            // 左へスワイプするときの処理
            int iconLeft = itemView.getRight() - iconMargin - mDeleteIcon.getIntrinsicWidth();
            int iconRight = itemView.getRight() - iconMargin;
            mDeleteIcon.setBounds(iconLeft, iconTop, iconRight, iconBottom);

            mDeleteBackground.setBounds(itemView.getRight() + ((int) dX) - backgroundCornerOffset,
                    itemView.getTop(), itemView.getRight(), itemView.getBottom());

        }

        mDeleteBackground.draw(c);
        mDeleteIcon.draw(c);
        }
});

0 件のコメント :

コメントを投稿