我使用带有ItemTouchHelper的RecyclerView进行滑动删除,并在滑动项下添加删除按钮,如下所示:
但是当我完成滑动时,该项目很快就会从列表中删除! 如何锁定刷过的项目,并通过单击删除按钮删除? 就像Gmail的行为一样。
答案 0 :(得分:4)
按照示例“Support7Demos / src / com / example / android / supportv7 / widget / touch / SwipeToDismissActivity.java”,对方法“onChildDraw”进行一些小改动
public boolean onChildDraw(Canvas c, RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
boolean isCurrentlyActive) {
float translationX = Math.min(-dX, viewHolder.itemView.getWidth() / 2);
viewHolder.itemView.setTranslationX(-translationX);
return true;
}
此方法必须返回true,否则ItemTouchUIUtil将覆盖translationX Screenshot
答案 1 :(得分:4)
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
float translationX;
if(dX > 0){
translationX = Math.min(-dX, viewHolder.itemView.getWidth() / 2);
}
else {
translationX = Math.max(dX, (-1)* viewHolder.itemView.getWidth() / 2);
}
super.onChildDraw(c, recyclerView, viewHolder, translationX, dY, actionState, isCurrentlyActive);
}
答案 2 :(得分:1)
在getMovementFlags()
上设置 OnClickListeners ,然后:
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
if (dX > ARCHIVE_LAYOUT_WIDTH) {
getDefaultUIUtil().onDraw(c, recyclerView, ((YOUR_VIEW_HOLDER) viewHolder).getSwipableView(), dX, dY, actionState, isCurrentlyActive);
}
}
这不是最干净的解决方案,但它会让你更接近。
答案 3 :(得分:0)
在此帖之前提出的解决方案仅占最终效果的1/5。
不幸的是,它们仅在您滑动打开1项时才起作用,但当您关闭它时,您需要从参数中恢复dX的数量,直到达到阈值。然后,当你释放时,你再次看到从中间开始的项目,因为你收到的真正的dX仍然指向中间!非常丑陋的故障。
我相信 ItemTouchHelper仅适用于每次完全刷一件商品。除非有办法停止接收大于所需宽度的dX,否则您需要解决以下问题:
答案 4 :(得分:0)
将 dX 除以 2, 3, 4 ... 以达到最小滑动
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder, float dX, float dY,
int actionState, boolean isCurrentlyActive) {
final View foregroundView = ((CreditCardAdapter.ViewHolder) viewHolder).itemView.findViewById(R.id.viewForeground);
super.onChildDraw(c, recyclerView, foregroundView, dX/3, dY,
actionState, isCurrentlyActive);
}