当前位置: 首页 > 知识库问答 >
问题:

刷卡时的RecyclerView ItemTouchHelper

莘俊能
2023-03-14

我正在尝试在回收器视图中实现“刷卡删除”。我有这个密码。

public abstract class SwipeToDeleteCallback extends ItemTouchHelper.Callback {
    private Context context;
    private Paint clearPaint;
    private ColorDrawable background;
    private int backgroundColor;
    private Drawable deleteDrawable;
    private int intrinsicWidth;
    private int intrinsicHeight;

    public SwipeToDeleteCallback(Context context) {
        this.context = context;
        background = new ColorDrawable();
        backgroundColor = Color.parseColor("#DB3236");
        clearPaint = new Paint();
        clearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        deleteDrawable = ContextCompat.getDrawable(this.context, R.drawable.ic_delete_white_24dp);
        intrinsicWidth = deleteDrawable.getIntrinsicWidth();
        intrinsicHeight = deleteDrawable.getIntrinsicHeight();
    }

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

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

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

        View itemView = viewHolder.itemView;
        int itemHeight = itemView.getHeight();

        boolean isCancelled = dX == 0 && !isCurrentlyActive;

        if (isCancelled) {
            clearCanvas(canvas, itemView.getRight() + dX, (float) itemView.getTop(),
                    (float) itemView.getRight(), (float) itemView.getBottom());
            super.onChildDraw(canvas, recyclerView, viewHolder, dX, dY, actionState,
                    isCurrentlyActive);
            return;
        }

        background.setColor(backgroundColor);
        background.setBounds(itemView.getRight() + (int) dX, itemView.getTop(),
                itemView.getRight(), itemView.getBottom());
        background.draw(canvas);

        int deleteIconTop = itemView.getTop() + (itemHeight - intrinsicHeight) / 2;
        int deleteIconMargin = (itemHeight - intrinsicHeight) / 2;
        int deleteIconLeft = itemView.getRight() - deleteIconMargin - intrinsicWidth;
        int deleteIconRight = itemView.getRight() - deleteIconMargin;
        int deleteIconBottom = deleteIconTop + intrinsicHeight;

        deleteDrawable.setBounds(deleteIconLeft, deleteIconTop, deleteIconRight, deleteIconBottom);
        deleteDrawable.draw(canvas);

        super.onChildDraw(canvas, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }

    private void clearCanvas(Canvas canvas, Float left, Float top, Float right, Float bottom) {
        canvas.drawRect(left, top, right, bottom, clearPaint);
    }

    @Override
    public float getSwipeThreshold(@NonNull RecyclerView.ViewHolder viewHolder) {
        return 0.7f;
    }
}

但是,问题是该行在刷卡时被删除。我希望将其保持在那里,即当该行被刷洗时,显示删除按钮,然后用户可以单击该行,而不是完全刷洗删除它,而是在刷洗后显示删除按钮。另外,我也在尝试添加编辑按钮,但在左边的删除按钮上,有什么想法吗?

共有2个答案

邢财
2023-03-14

我发现这种实现刷卡删除的新方法非常友好,那就是在创建方法中实现新的ItemTouchHelper()。你所要做的就是把你要删除的项目的位置传入回收站。请参阅下面的示例代码。在这里,我实现了新的ItemTouchHelper(),它可以删除我在屏幕右侧或左侧滑动的任何笔记。

代码如下:

new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
            ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
            return false;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
            noteViewModel.delete(noteAdapter.getNoteAt(viewHolder.getAdapterPosition()));
            Toast.makeText(MainActivity.this, "Note Deleted", Toast.LENGTH_SHORT).show();
        }
    }).attachToRecyclerView(rv_notes);

rv_notes是我的recyclerview的实例

要了解如何清楚地实现它,请遵循我的github中的代码。这是链接。https://github.com/sammymutahigicheru/NoteApp

李森
2023-03-14

创建ItemTouchHelper并将其附加到回收视图。

将帮助程序附加到RecyclerView的代码

itemTouchHelper = new ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);

ItemTouchHelper类的代码

ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {

        private void drawText(String text, Canvas c, RectF button, Paint p) {
            float textSize = 30;
            p.setColor(Color.WHITE);
            p.setAntiAlias(true);
            p.setTextSize(textSize);

            float textWidth = p.measureText(text);
            c.drawText(text, button.centerX() - (textWidth / 2), button.centerY() + (textSize / 2), p);
        }

        @Override
        public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
            if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {

                View itemView = viewHolder.itemView;
                Paint p = new Paint();

                if (dX > 0) {
                    c.drawRect((float) itemView.getLeft(), (float) itemView.getTop(), dX,
                            (float) itemView.getBottom(), p);
                } else {
                    RectF rightButton = new RectF(itemView.getRight() - 200, (itemView.getTop() + dpToPx(4)),
                            (itemView.getRight() - dpToPx(4)), (itemView.getBottom() - dpToPx(8)));
                    p.setColor(ContextCompat.getColor(MainActivity.this, R.color.colorAccent));
                    c.drawRoundRect(rightButton, 10, 10, p);
                    drawText("Del", c, rightButton, p);
                }

                // Fade out the view when it is swiped out of the parent
                final float alpha = 1 - Math.abs(dX) / (float) viewHolder.itemView.getWidth();
                viewHolder.itemView.setAlpha(alpha);
                viewHolder.itemView.setTranslationX(dX);
            } else {
                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
            }
        }

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

        @Override
        public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
            final int position = viewHolder.getAdapterPosition();
            if (direction == ItemTouchHelper.LEFT) {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setMessage("Are you sure to delete?");
                builder.setPositiveButton("REMOVE", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        adapter.notifyItemRemoved(position);
                        mProductViewModel.delete(adapter.getItem(position));
                        return;
                    }
                }).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {  //not removing items if cancel is done
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        adapter.notifyItemRemoved(position + 1);
                        adapter.notifyItemRangeChanged(position, adapter.getItemCount());
                        return;
                    }
                }).show();  //show alert dialog
            }
        }
    };
 类似资料:
  • 是否有一种方法可以在一次刷卡中实现一次只刷一张卡来解除颤振动作?

  • 说明 微信刷卡支付SDK。 官方文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1 类 请求参数类 支付参数 类名:\Yurun\PaySDK\Weixin\Micropay\Params\Pay\Request 属性 名称 类型 说明 $_apiMethod string 接口名称 $auth_c

  • 我的测试包括一个元素列表。单击第一个以打开它,然后从右向左滑动以访问下一个并确保它们不同。 在Android上,它工作得很好,但出于某种原因,驱动程序在进入新页面后似乎没有刷新自己。 如果我试图访问一个文本我一直有元素从第一页即使我在第二或第三元素的列表 Appium iOS中是否有某种刷新页面? 这是我的代码: 寻找我的头衔 刷卡 然后重新制作“查找标题”功能,甚至我的ipad上的“难看的我”屏

  • 我正在开发一个应用程序,其中我有一个基本的活动,当我从左向右滑动时,我需要得到一个滑动窗口,其中将显示几个图标,当我从右到左单击时,我需要从右向左滑动窗口...我研究了一下...nd发现一些选项,如导航抽屉和滑动窗口和视图寻呼机....但是滑动手势jst从一个页面连续滑动到另一个页面...我不想要那个...当我从左向右和从右向左滑动时,我需要显示几个图标....但我不知道到底要用哪一个来更好地导航

  • 我的应用程序中有一个ViewPager,我想随时禁用/允许向右滑动。viewpager中的每个视图都包含ListView。我该怎么做?我正试图这样做: 但视图仍将向右移动一点。有人在解决同样的问题吗?

  • 卡片刷新插件提供将 Ajax 内容加载到卡片中的功能。 用法 该插件可以作为 jQuery 插件或使用数据 API 激活。 数据 API 通过向卡片添加带有 data-card-widget="card-refresh" 的按钮来激活插件,并提供所需的 data-source="/内容 URL" 选项。这样,插件将自动创建一个对设置 URL 的 GET 请求,并将返回的内容展示在卡片的 .card