使用ItemTouchHelper进行滑动即可closures,同时显示另一个视图

我有一个RecyclerView,并希望允许我的用户使用滑动手势从列表中删除项目。 但是从其他应用程序(例如Gmail)中可以知道,我想在其后面显示一个删除图标,以便我的用户知道刷卡会导致删除。 但是,我找不到一个明显的方法来做到这一点。 ItemTouchHelper使用viewHolder.itemView,所以它占用整行。

我的代码:

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) { @Override public boolean onMove( final RecyclerView recyclerView, final RecyclerView.ViewHolder viewHolder, final RecyclerView.ViewHolder target) { return false; } @Override public void onSwiped( final RecyclerView.ViewHolder viewHolder, final int swipeDir) { adapter.remove(viewHolder.getAdapterPosition()); } }; ItemTouchHelper itemTouchHelper = new ItemTouchHelper( simpleItemTouchCallback ); itemTouchHelper.attachToRecyclerView(itemsRecyclerView); itemsRecyclerView.setLayoutManager( new LinearLayoutManager(getContext()) ); itemsRecyclerView.setAdapter(adapter); 

有没有人有胶水,如果这是可能的呢? 我现在唯一可以想象的是扩展ItemTouchHelper /复制代码,而不是使用viewHolder.itemView我使用ID标识的视图。

Solutions Collecting From Web of "使用ItemTouchHelper进行滑动即可closures,同时显示另一个视图"

我已经完成了与回收器视图项目具有以下布局结构:

 <FrameLayout background = dark> <AnyLayout with content android:id="@+id/removable"> </AnyLayout> <FrameLayout> 

然后我使用这个视图保持器作为我的适配器中的基本视图保持器

 public class RemovableViewHolder extends RecyclerView.ViewHolder { private View mRemoveableView; public RemovableViewHolder(final View itemView) { super(itemView); mRemoveableView = itemView.findViewById(R.id.removable); } public View getSwipableView() { return mRemoveableView; } } 

在我的ItemTouchHelper.Callback类中,我扩展了如下的方法:

 @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { if (viewHolder instanceof RemovableViewHolder) { int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; return makeMovementFlags(0, swipeFlags); } else return 0; } @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { getDefaultUIUtil().clearView(((RemovableViewHolder) viewHolder).getSwipableView()); } @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { if (viewHolder != null) { getDefaultUIUtil().onSelected(((RemovableViewHolder) viewHolder).getSwipableView()); } } public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { getDefaultUIUtil().onDraw(c, recyclerView, ((RemovableViewHolder) viewHolder).getSwipableView(), dX, dY, actionState, isCurrentlyActive); } public void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { getDefaultUIUtil().onDrawOver(c, recyclerView, ((RemovableViewHolder) viewHolder).getSwipableView(), dX, dY, actionState, isCurrentlyActive); } 

使用这种方法,您可以在布局中使用一个级别,但是可以通过在canvas上绘图来节省自己的麻烦。 你也可以select其他的视图内的项目,例如保存一个被触摸并返回它,并有一个项目的孩子也可以滑动。

使用ItemTouchHelper中的onChildDraw()方法 – 我使用位图和彩色背景,用不同的颜色和图标向左和向右滑动:

  @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 paint = new Paint(); Bitmap bitmap; if (dX > 0) { // swiping right paint.setColor(getResources().getColor(R.color.child_view_complete)); bitmap = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.mipmap.ic_circle_complete); float height = (itemView.getHeight() / 2) - (bitmap.getHeight() / 2); c.drawRect((float) itemView.getLeft(), (float) itemView.getTop(), dX, (float) itemView.getBottom(), paint); c.drawBitmap(bitmap, 96f, (float) itemView.getTop() + height, null); } else { // swiping left paint.setColor(getResources().getColor(R.color.primaryColorAccent)); bitmap = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.mipmap.ic_circle_bin); float height = (itemView.getHeight() / 2) - (bitmap.getHeight() / 2); float bitmapWidth = bitmap.getWidth(); c.drawRect((float) itemView.getRight() + dX, (float) itemView.getTop(), (float) itemView.getRight(), (float) itemView.getBottom(), paint); c.drawBitmap(bitmap, ((float) itemView.getRight() - bitmapWidth) - 96f, (float) itemView.getTop() + height, null); } super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); } } 

96f可以用你想要的左右任何距离replace。 这不是完美的,当我在适配器中的2个项目,我删除了一个位置的canvas不会消失,直到适配器再次设置 – 努力尝试现在解决 – 我会更新,如果我find一个完整的解决scheme,但现在这是我认为你正在寻找。