RecyclerView ItemTouchHelper Boutons de Balayage
Je suis en train de le port certains la fonctionnalité d'iOS à Android.
J'ai l'intention de créer une table où sur balayez vers la gauche montre 2 bouton: Modifier et Supprimer.
J'ai été jouer avec elle et je sais que je suis très proche. Le secret repose sur la méthode OnChildDraw.
Je voudrais Dessiner un Rectangle qui s'adapte le texte à Supprimer puis dessiner le texte à Modifier, en plus, il à leur couleur d'arrière-plan. Le reste des blancs de l'espace lorsque l'utilisateur clique dessus devrait restaurer la rangée à sa position initiale.
J'ai réussi à peindre l'arrière-plan lorsque l'utilisateur est en glissant sur les côtés, mais je ne sais pas comment ajouter les auditeurs et une fois qu'il est glissée sur le côté, le glissement de la fonction commence à faire des siennes.
Je suis en train de travailler sur Xamarin, mais pure java solutions sont également acceptés comme je peux facilement les porter à 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);
}
}
}
C'est ce que j'ai actuellement.
Si vous savez comment ajouter des écouteurs ou des suggestions, veuillez laisser un commentaire!
Mise à JOUR:
Je viens de réaliser que sur un double tap sur le blanc de l'espace restant de la ligne déjà restaurer la rangée à son état initial. Pas un seul robinet si 🙁
- souffrant de la même question.
- Je vais poster ma solution rapidement à ce problème depuis que j'ai fait c'est un peu différent que d'être acceptées répondre
Vous devez vous connecter pour publier un commentaire.
Suivantes Wenxi Zeng réponse ici, si vous voulez avoir le texte dans les boutons sur plusieurs lignes, remplacer UnderlayButton onDraw avec cette méthode:
Si vous souhaitez bouton(s) sur le côté gauche ainsi lors de la glisser dans l'autre sens, juste essayer d'ajouter ces lignes simples existants dans la réponse:
Dans drawButtons méthode:
private void drawButtons(Toile c, Vue itemView, Liste de la mémoire tampon, int pos, float dX) {
flotteur droit = itemView.getRight();
flotteur gauche = itemView.getLeft();
flotteur dButtonWidth = (-1) * dX /tampon.size();
Dans la méthode onDraw vérifier la valeur de dX et de l'ensemble du texte et la couleur des boutons:
public void onDraw(Canvas c, RectF rect, int pos, float dX) {
Peinture p = new Paint();
Si vous utilisez un
RecyclerView
, essayez d'utiliserOnScrollListener
. Faire quelque chose comme cela.Je voulais utiliser cette touche à la geste de mon application trop, après avoir travaillé trop avec Itemtouchhelper j'ai décidé d'écrire ma propre touche gestionnaire:
Remarque: comme ontouchlistener de votre viewholder contenu lorsque la création de la viewholder. Vous pouvez ajouter vos animations pour retourner l'objet à sa première place.
Vous pouvez également écrire votre propre layoutmanager de bloc de défilement verticale alors que le point est à la baisse.
J'ai une solution beaucoup plus simple:
dans onChildDraw(), il suffit d'augmenter sa largeur par la dX valeur.
Assurez-vous de ne pas appeler le défaut de super.onChildDraw()
Puisque je n'ai pas vu nulle part comment mettre en œuvre et j'ai réussi à obtenir que cela fonctionne, je vais poster une solution à ce problème qui est au travail mais il est en c# Xamarin Android.
Si vous en avez besoin natif android, vous devez la convertir en natif android, ce qui ne devrait pas être très dur. Je pourrais le faire à une date ultérieure si elle est très demandée.
C'est mon ItemHelper de la classe de base:
Ensuite sur votre élément de la classe helper vous avez:
Ensuite sur votre activité, vous avez:
Mettre cette OnCreate
Puis sur l'activité de redéfinir cette méthode:
C'est la méthode d'assistance que j'ai créé pour être utilisé par l'envoi de l'événement:
C'est un peu complexe, mais il fonctionne bien. J'ai testé de nombreuses façons. Laissez-moi savoir si vous avez des difficultés pour la mise en œuvre de cette