RecyclerView ItemTouchHelper如何锁定滑动项目?

时间:2015-11-05 16:18:08

标签: android android-recyclerview

我使用带有ItemTouchHelper的RecyclerView进行滑动删除,并在滑动项下添加删除按钮,如下所示: Swiping spec

但是当我完成滑动时,该项目很快就会从列表中删除! 如何锁定刷过的项目,并通过单击删除按钮删除? 就像Gmail的行为一样。

PS。我在这里发布相同的问题 https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=189057

5 个答案:

答案 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)

SimpleCallback

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