Utilice ItemTouchHelper para deslizar-a-despedir con otra vista que se muestra detrás del barrido hacia fuera

Tengo un RecyclerView y quiero permitir que mis usuarios utilicen un gesto del golpe para quitar artículos de la lista. Pero como se sabe de otras aplicaciones (por ejemplo, Gmail), quiero mostrar un icono de eliminación detrás de él, para que mis usuarios saben que el deslizamiento resulta en una eliminación. Sin embargo, no puedo encontrar una manera obvia de hacer eso. El ItemTouchHelper utiliza el viewHolder.itemView, por lo que toma toda la fila.

Mi código:

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

¿Hay alguien pegado si esto es posible? Lo único que puedo imaginar ahora es extender el ItemTouchHelper / copiar el código, y en lugar de usar viewHolder.itemView tomo una vista identificada por un ID.

2 Solutions collect form web for “Utilice ItemTouchHelper para deslizar-a-despedir con otra vista que se muestra detrás del barrido hacia fuera”

Lo he hecho con tener la siguiente estructura de diseño para el elemento de vista de reciclador:

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

Entonces utilizo este sostenedor de la opinión como sostenedor de la vista de la base en mi adaptador:

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

En mi clase ItemTouchHelper.Callback extiendo los siguientes métodos como eso:

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

Con este enfoque se utiliza un nivel en los diseños más, pero se ahorra problemas con el dibujo en lienzo. También puede seleccionar otras vistas dentro del elemento, por ejemplo, guardar una que fue tocado y devolverlo y tener hijos de un elemento también se puede deslizar.

Utilizar el método onChildDraw () de ItemTouchHelper – Tengo que trabajar con un mapa de bits y fondo de color para pasar izquierda y derecha con diferentes colores e iconos:

  @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 se puede reemplazar con cualquier distancia del lado izquierdo / derecho que usted quisiera que fuera. Esto no es perfecto, como cuando estoy abajo de 2 elementos en el adaptador y quitar una posición de la lona no desaparece y se mantiene hasta que el adaptador se establece de nuevo – trabajando en tratar de resolver ahora – voy a actualizar si encuentro Una solución completa, pero por ahora esto es lo que creo que estás buscando.

  • RecyclerView no se desplaza como se esperaba
  • Teclado suave se abre y luego se cierra al hacer clic en edittext
  • Imagen parpadeando mientras se desplaza en RecyclerView
  • Mostrar datos SQLite en RecyclerView
  • ¿Cómo deslizar para borrar en RecyclerView?
  • Los elementos no tienen el mismo ancho cuando se utiliza RecyclerView GridLayoutManager para establecer el espaciado de columnas por ItemDecoration
  • Recyclerview (Obtener elemento en Recyclerview)
  • ¿Cómo usar la API fluida de MvvmCross para enlazar TextView de un elemento de RecyclerView a una propiedad de su ViewModel en Android?
  • ¿Hay alguna manera de mostrar Google Admob en Android Recycler View
  • Span múltiples columnas con RecyclerView
  • Recyclerview de Android vs ListView con el usuario
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.