Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.