Botões de toque no furto do deslizador
Estou tentando portar algumas funcionalidades do iOS para o Android.
Eu pretendo criar uma tabela onde deslize para a esquerda mostra 2 botões: Editar e Excluir.
Eu brinco com isso e sei que estou muito perto. O segredo realmente está no método OnChildDraw.
Gostaria de desenhar um Rect que se encaixe no texto Excluir e, em seguida, desenhe o texto Editar com a respectiva cor de fundo. O espaço em branco restante quando clicado deve restaurar a linha para sua posição inicial.
Consegui pintar o plano de fundo enquanto o usuário desliza para os lados, mas não sei como adicionar os ouvintes e, depois que ele é deslocado para o lado, a função de arrastar começa a se comportar mal.
Estou trabalhando no Xamarin, mas soluções java puras também são aceitas, pois posso portá-las facilmente para 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);
}
}
}
Isto é o que eu tenho atualmente.
Se você sabe como adicionar ouvintes ou alguma sugestão, por favor deixe um comentário!
ATUALIZAR:
Acabei de perceber que, ao tocar duas vezes no espaço em branco restante da linha, ela já restaura a linha ao seu estado inicial. Nem um único toque :(