4 votes

Comment détecter si un élément de Recyclerview est balayé ?

J'essaie d'ajouter la fonctionnalité de glisser pour supprimer ainsi que d'afficher la feuille inférieure si l'élément RecyclerView est appuyé longuement. J'utilise ItemTouchHelper.SimpleCallback pour swipe to delete (glisser pour supprimer) et ItemTouchListener pour afficher une fenêtre contextuelle en cas d'appui long sur un élément. Le problème est que lorsque je fais glisser l'élément à supprimer, il détecte également l'appui long. Ce que je veux, c'est qu'il ne tienne pas compte de l'appui long lorsque l'élément est balayé. J'ai une classe ItemTouchHelper qui étend Simplecallback pour le swipe to delete. Le code suivant permet d'attacher la vue recyclée à la fonction "swipe to delete".

 ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new RecyclerItemTouchHelper(0, ItemTouchHelper.LEFT, this);
    new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView);

Le code suivant permet d'ajouter un récepteur pour l'événement de clic long.

 recyclerView.addOnItemTouchListener(new NotesRecyclerTouchListener(getApplicationContext(), recyclerView, new NotesRecyclerTouchListener.ClickListener() {
        @Override
        public void onLongClick(View view, int position) {
                Note note = notesList.get(position);
                Toast.makeText(getApplicationContext(), note.getTitle() + " is log pressed!", Toast.LENGTH_SHORT).show();
                View sheetView = MainActivity.this.getLayoutInflater().inflate(R.layout.view_bottom_sheet_dialog, null);
                BottomSheetDialog dialog = new BottomSheetDialog(MainActivity.this);
                dialog.setContentView(sheetView);
                dialog.show();
        }
    }));

3voto

Wojtek Okoński Points 56

onSwiped sera appelé lorsque l'objet sera complètement passé. Si vous commencez à balayer l'élément mais que vous le ramenez ensuite en arrière, la méthode ne sera pas appelée. Vous ne devez donc pas utiliser cette méthode pour marquer la fin du balayage. Vous pouvez utiliser isCurrentlyActive de onChildDraw comme ceci :

var swiping: Boolean = false

override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean) {
    super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
        swiping = isCurrentlyActive
    }
}

Elle sera vraie lorsque vous déplacez l'élément et fausse après le balayage ou l'annulation du balayage.

2voto

Jan Stoltman Points 317

Comme @DavidVelasquez l'a suggéré, vous devriez mettre en place un drapeau lorsque le swipe commence et agir en fonction de son état dans votre onLongClick() Mais onSwiped() n'est pas la bonne solution. Vous devriez plutôt utiliser ItemTouchHelper.SimpleCallback#onChildDraw() méthode de détection du moment où l'on passe d'un objet à l'autre et onSwiped() pour détecter sa fin.

Eg.

override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int,isCurrentlyActive: Boolean) {
    if(actionState == ItemTouchHelper.ACTION_STATE_SWIPE){
        setupMyFlag()
    }
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
    clearMyFlag()
}

Ensuite, il suffit de vérifier ce drapeau dans votre onLongClick()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X