使用ItemTouchHelper进行滑动以解除与刷出后面显示的另一个视图

我有一个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进行滑动以解除与刷出后面显示的另一个视图"

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

     

然后我在我的适配器中使用此视图持有者作为基本视图持有者:

 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上绘制时可以省去自己的麻烦。 您也可以在项目中选择其他视图,例如保存一个被触摸并返回的视图,并让项目的子项也可以刷卡。

使用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可以替换为您想要的左/右侧的任何距离。 这并不完美,因为当我在适配器中使用2个项目时,我删除了一个位置canvas不会消失并保持直到适配器再次设置 – 正在尝试立即解决 – 如果我find,我会更新一个完整的解决方案,但现在这是我认为你正在寻找的。