studio recyclerview make how dependency create android android-recyclerview

android - recyclerview - Use ItemTouchHelper para deslizar para despedir con otra vista que se muestra detrĂ¡s del barrido



recyclerview dependency (2)

utilice el método onChildDraw () de ItemTouchHelper: lo tengo trabajando con un mapa de bits y un fondo de color para deslizar hacia la izquierda y la 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 la distancia desde el lado izquierdo / derecho que le gustaría que fuera. Esto no es perfecto ya que cuando tengo 2 elementos en el adaptador y elimino una posición, el lienzo no desaparece y permanece hasta que el adaptador vuelva a estar configurado, estoy tratando de resolverlo ahora. Lo actualizaré si encuentro una solución completa, pero por ahora esto es lo que creo que estás buscando.

Tengo un RecyclerView y quiero permitir que mis usuarios usen un gesto deslizante para eliminar elementos de la lista. Pero como se sabe de otras aplicaciones (por ejemplo, Gmail), quiero mostrar un ícono de eliminación detrás de él, para que mis usuarios sepan que deslizar los resultados es una eliminación. Sin embargo, no puedo encontrar una forma obvia de hacerlo. ItemTouchHelper usa viewHolder.itemView, por lo que ocupa 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);

¿Alguien tiene pegamento si esto es posible? Lo único que me puedo imaginar en este momento es extender ItemTouchHelper / copiar el código, y en lugar de usar viewHolder.itemView, tomo una vista identificada por una ID.


Lo hice teniendo la siguiente estructura de disposición para el artículo de la vista de reciclador:

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

Luego uso este titular de vista como soporte de vista 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 de esa manera:

@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, usa un nivel más en los diseños, pero se ahorra problemas al dibujar en Canvas. También puede seleccionar otras vistas dentro del elemento, por ejemplo, guardar una que haya sido tocada y devolverla y hacer que los elementos secundarios de un elemento también se puedan deslizar.