Si vous avez un événement lié aux éléments de la liste, le fait de faire glisser la liste avec l'une de ces solutions déclenchera toujours l'événement. Vous souhaitez utiliser la méthode suivante pour tenir compte de l'attente des utilisateurs d'annuler l'événement en le faisant glisser hors de l'élément sélectionné (adapté de la réponse de Pointer Null) :
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
final int actionMasked = ev.getActionMasked() & MotionEvent.ACTION_MASK;
if (actionMasked == MotionEvent.ACTION_DOWN) {
// Record the position the list the touch landed on
mPosition = pointToPosition((int) ev.getX(), (int) ev.getY());
return super.dispatchTouchEvent(ev);
}
if (actionMasked == MotionEvent.ACTION_MOVE) {
// Ignore move events
return true;
}
if (actionMasked == MotionEvent.ACTION_UP) {
// Check if we are still within the same view
if (pointToPosition((int) ev.getX(), (int) ev.getY()) == mPosition) {
super.dispatchTouchEvent(ev);
} else {
// Clear pressed state, cancel the action
setPressed(false);
invalidate();
return true;
}
}
return super.dispatchTouchEvent(ev);
}
La classe de vue personnalisée complète est disponible : https://gist.github.com/danosipov/6498490