2015-11-05 133 views
11

我用RecyclerView与ItemTouchHelper做刷卡删除,并添加类似这样的刷卡项目下删除按钮: Swiping specRecyclerView ItemTouchHelper如何锁定滑动项目?

但是,当我完成刷卡,该项目将被从列表中移除很快! 如何锁定已滑动的物品,并通过点击删除按钮将其删除? 就像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

+0

你有能力实现它..如果是的请分享recyclerview的ItemTouchHelper ...我卡住了,我发布了类似这样的问题,http://stackoverflow.com/questions/35131463/swipe -with-recyclerview-without-any-third-party-library – TheReprator

回答

0

张贴同样的问题在您的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); 
    } 
} 

这不是最干净的解决方案,但它让你更接近。

4

只需按照例如 “Support7Demos/src目录/ COM /例子/安卓/ supportv7 /空间/触摸/ 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

+0

很酷它为我的woking –

3
@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); 
} 
+0

不幸的是,这只适用于当你打开时,当你关闭你需要恢复你收到的dX,直到你达到门槛。然后,当您释放时,您会看到从中间开始的项目,因为真正的dX位于中间。 – Davidea

0

这个职位之前提出的解决方案使只有最终效果1/5。

不幸的是,它们只在滑动才能打开1个项目时才起作用,但当您关闭它时,您需要恢复从参数接收的dX量,直到达到阈值。然后,当你释放你看到从中间开始的项目,因为你收到的真正的dX仍然指向中间!真是丑陋的故障。

我相信ItemTouchHelper仅适用于每次完全滑动1个项目。除非有一种方法可以停止接收DX比所需的宽度更大,那么你需要解决以下问题:

  • 您需要添加一个复杂的逻辑来发现哪个项目挥动指的是。
  • 如果滚动,则刷卡效果也会丢失。
  • 最后,你不能点击后视图,你需要跟踪物品处于滑动位置,如果你没有保存它,只要你点击它,它会重新绘制前视图和动画。