android - 滑动时的 RecyclerView ItemTouchHelper
问题描述
我正在尝试在回收站视图中实现滑动删除。我有这个代码。
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;
}
}
但是,问题是该行在滑动时被删除。我想将它保留在那里,即当滑动该行时,显示删除按钮,然后用户可以单击它,而不是滑动完全删除它,而是在滑动后显示删除按钮。另外,我也在尝试添加编辑按钮,但在左侧,删除,有什么想法吗?
解决方案
我发现这种实现滑动删除的新方法非常友好,即在 oncreate 方法中实现 new ItemTouchHelper()。您所要做的就是在 recyclevew 中传递要删除的项目的位置。请参阅下面的示例代码。在这里我实现了新的 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
推荐阅读
- javascript - 具有多种颜色的三个.js 形状
- visual-studio-code - 有没有办法从 VS Code 中的自动格式化中省略某些代码部分?
- c# - 样式不适用于主视图以外的视图(asp.net core mvc 5.0)
- swift - 更改方案后反应本机 Bridge 崩溃
- multithreading - 第二种形式作为等待形式并更新其标签。[在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke]
- tensorflow - 如何在深度学习模型中制作软准确率和损失曲线
- r - 为什么我的 x 轴在我的数据结束之前被切断,当我尝试添加 xlim() 时出现错误?
- kubernetes - 如何让浏览器与不同的 Pod 对话?
- java - Hibernate InheritanceType 加入 PostgreSQL
- lotus-domino - 如何将 RFC822 内容读取为纯文本?