RecyclerView ItemTouchHelper Botones al deslizar
Estoy tratando de portar algunas funciones de iOS a Android.
Tengo la intención de crear una tabla donde al deslizar a la izquierda muestra el botón 2: Editar y Eliminar.
He estado jugando con eso y sé que estoy muy cerca. El secreto realmente radica en el método OnChildDraw.
Me gustaría dibujar un Rect que se ajuste al texto Eliminar y luego dibujar el texto Editar junto con su color de fondo respectivo. El espacio en blanco restante al hacer clic debería restaurar la fila a su posición inicial.
Me las arreglé para pintar el fondo mientras el usuario desliza hacia los lados, pero no sé cómo agregar los oyentes y una vez que se desliza hacia un lado, la función de arrastre comienza a comportarse mal.
Estoy trabajando en Xamarin, pero también se aceptan soluciones java puras, ya que puedo portarlas fácilmente a c #.
public class SavedPlacesItemTouchHelper : ItemTouchHelper.SimpleCallback
{
private SavedPlacesRecyclerviewAdapter adapter;
private Paint paint = new Paint();
private Context context;
public SavedPlacesItemTouchHelper(Context context, SavedPlacesRecyclerviewAdapter adapter) : base(ItemTouchHelper.ActionStateIdle, ItemTouchHelper.Left)
{
this.context = context;
this.adapter = adapter;
}
public override bool OnMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)
{
return false;
}
public override void OnSwiped(RecyclerView.ViewHolder viewHolder, int direction)
{
}
public override void OnChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, bool isCurrentlyActive)
{
float translationX = dX;
View itemView = viewHolder.ItemView;
float height = (float)itemView.Bottom - (float)itemView.Top;
if (actionState == ItemTouchHelper.ActionStateSwipe && dX <= 0) // Swiping Left
{
translationX = -Math.Min(-dX, height * 2);
paint.Color = Color.Red;
RectF background = new RectF((float)itemView.Right + translationX, (float)itemView.Top, (float)itemView.Right, (float)itemView.Bottom);
c.DrawRect(background, paint);
//viewHolder.ItemView.TranslationX = translationX;
}
else if (actionState == ItemTouchHelper.ActionStateSwipe && dX > 0) // Swiping Right
{
translationX = Math.Min(dX, height * 2);
paint.Color = Color.Red;
RectF background = new RectF((float)itemView.Right + translationX, (float)itemView.Top, (float)itemView.Right, (float)itemView.Bottom);
c.DrawRect(background, paint);
}
base.OnChildDraw(c, recyclerView, viewHolder, translationX, dY, actionState, isCurrentlyActive);
}
}
}
Esto es lo que tengo actualmente.
Si sabes cómo agregar oyentes o alguna sugerencia, ¡deja un comentario!
ACTUALIZAR:
Me acabo de dar cuenta de que al tocar dos veces el espacio restante en blanco de la fila ya restauramos la fila a su estado inicial. Sin embargo, ni un solo toque :(