43 votes

Désactiver le défilement dans la liste

J'ai une vue de liste et, selon une logique, je souhaite désactiver temporairement le défilement. view.setOnScrollListener(null); ne m'aide pas, je suppose que j'ai besoin d'écrire du code, quelqu'un peut-il me donner un historique ou un extrait ?

Merci

44voto

Une autre option sans créer une nouvelle ListView personnalisée serait d'attacher un onTouchListener à votre ListView et de retourner true dans le onTouch() si l'action d'événement de mouvement est ACTION_MOVE .

 listView.setOnTouchListener(new OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event) {
        return (event.getAction() == MotionEvent.ACTION_MOVE);
    }
});

43voto

Pointer Null Points 14229

Dans votre CustomListView :

 @Override
public boolean dispatchTouchEvent(MotionEvent ev){
   if(ev.getAction()==MotionEvent.ACTION_MOVE)
      return true;
   return super.dispatchTouchEvent(ev);
}

Ensuite, ListView réagira aux clics, mais ne changera pas la position de défilement.

32voto

Nikita Points 337

utilisez listview.setEnabled(false) pour désactiver le défilement de la liste

Remarque : Cela désactive également les sélections de lignes

8voto

MoshErsan Points 5119

faites votre CustomListView

 @Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
  if(needToStop){
    return false;}
    return super.onInterceptTouchEvent(ev); 
}

sur false les enfants géreront l'événement tactile, assurez-vous de mettre votre if condition pour vérifier que vous devez faire défiler ou non.

8voto

Dan Osipov Points 526

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

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