2010-06-09 8 views
12

J'ai un problème avec android version 2.1. Cela ressemble à un bug. Je joins un OnScrollListener à ma listeAfficher.android: AbsListView.OnScrollListener SCROLL_STATE_IDLE n'est pas appelé après SCROLL_STATE_TOUCH_SCROLL (Version 2.1)

J'utilise la méthode onScrollStateChanged(AbsListView view, int scrollState) pour surveiller l'état de défilement de ma liste.

Le scrollstate pourrait prendre 3 valeur (tirée de la documentation):

  1. SCROLL_STATE_FLING: L'utilisateur avait déjà été défilement à l'aide toucher et avait effectué une passade. L'animation s'arrête maintenant
  2. SCROLL_STATE_IDLE: La vue n'est pas défilement. Notez naviguer dans la liste en utilisant le nombre de boule de commande comme étant dans l'état inactif puisque ces transitions ne sont pas animées.
  3. SCROLL_STATE_TOUCH_SCROLL: L'utilisateur défile en utilisant le toucher et le doigt est encore à l'écran

Je suppose que le SCROLL_STATE_IDLE sera toujours passée après l'un des deux autres Etats. C'est toujours vrai sauf pour Android 2.1. SCROLL_STATE_IDLE n'est pas passé après SCROLL_STATE_TOUCH_SCROLL Le problème se produit également si vous arrêtez le Fling par une touche au lieu de laisser l'arrêt de défilement par lui-même. Ce comportement étrange laisse ma listView dans un état inconsistant.

Quelqu'un a le même problème? Suggestion pour un travail «pas si sale»?

+0

Il n'y a pas encore été fixé? – st0le

Répondre

2

j'ai eu un problème similaire sur 2.2.

Si la liste est assez grande et que je défile vers le haut, j'ai d'abord CROLL_STATE_TOUCH_SCROLL pendant que mon doigt est sur l'écran. Quand mon doigt quitte l'écran, j'ai le SCROLL_STATE_FLING. Lorsque ma vue a cessé de bouger, j'ai reçu le SCROLL_STATE_IDLE. Mais, si pendant le défilement, il atteint View Haut ou Bas, je ne fais que défiler/lancer des valeurs et jamais le ralenti.

J'ai regardé le projet d'étagères de Romain Guy et son implémentation souffre du même problème sur 2.2.x Je me demande s'il avait déjà remarqué.

Je n'ai pas encore essayé avec 2.3.x

2

J'ai trouvé quelque chose d'une solution de contournement pour cela (au moins pour le niveau de l'API 9+, où je vois toujours le bug). J'utilise un GridView, mais je crois que cela devrait aussi fonctionner pour ListView.

J'utilise une sous-classe de GridView où je détecter la Défilement prolongé (haut ou bas):

public class CustomGridView { 
    private boolean mIsOverScrolled = false; 

    @Override 
    protected void onOverScrolled(int scrollX, int scrollY, 
         boolean clampedX, boolean clampedY) { 
    mIsOverScrolled = true; 
    super.onOverScrolled(scrollX, scrollY, clampedX, clampedY); 
    } 

    public boolean isOverScrolled() { 
    return mOsOverScrolled; 
    } 

    public void clearOverScroll() { 
    mIsOverScrolled = false; 
    } 
} 

Puis, dans mon OnScrollListener de CustomGridView, j'ai:

@Override 
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, 
          int totalItemCount) { 
    if (gridView.isOverScrolled()) { 
    gridView.clearOverScroll(); 
    } 

    // ... 
} 

maintenant quand je vérifie pour OnScrollListener.SCROLL_STATE_IDLE, je vérifie également si !gridView.isOverScrolled(). Je ne suis pas sûr si cela corrige vos cas d'utilisation spécifiques, mais j'espère que vous pouvez utiliser l'information supplémentaire pour déterminer votre état actuel malgré le bogue.

0

J'ai eu ce même problème et affiché une solution de contournement sur la liste des bogues mentionné par DeRagan: Link

Questions connexes