2010-06-09 8 views
12

Tengo un problema con la versión 2.1 de Android. Parece un error.android: AbsListView.OnScrollListener SCROLL_STATE_IDLE no se invoca después de SCROLL_STATE_TOUCH_SCROLL (Versión 2.1)

Adjunté un OnScrollListener a mi listaVer.

Estoy usando el método onScrollStateChanged(AbsListView view, int scrollState) para controlar el estado del scroll de mi lista de lista.

El scrollstate podría asumir 3 valor (tomado de la documentación):

  1. SCROLL_STATE_FLING: El usuario había sido previamente desplaza usando táctil y había realizado una aventura. La animación ahora está deteniéndose en una parada
  2. SCROLL_STATE_IDLE: La vista no está desplazándose. Tenga en cuenta que navega por la lista utilizando el trackball cuenta como en el estado inactivo ya que estas transiciones no están animadas.
  3. SCROLL_STATE_TOUCH_SCROLL: El usuario se desplaza utilizando el tacto, y su dedo todavía está en la pantalla

Asumo que el SCROLL_STATE_IDLE siempre será aprobada después de uno de los otros dos estados. Siempre es cierto excepto para la versión 2.1 de Android. SCROLL_STATE_IDLE no se pasa después SCROLL_STATE_TOUCH_SCROLL El problema ocurre también si se detiene la aventura por un toque en lugar de dejar que el tope de desplazamiento por sí mismo. Este comportamiento extraño deja mi ListView en un estado inconsistente.

Someonelse tiene el mismo problema? ¿Sugerencias para un trabajo "no tan sucio"?

+0

Se ha fijado ninguna todavía? – st0le

Respuesta

2

tengo un problema similar en 2.2.

Si la lista es lo suficientemente grande y me desplazo hacia abajo, primero obtuve CROLL_STATE_TOUCH_SCROLL mientras mi dedo está en la pantalla. Cuando mi dedo sale de la pantalla, recibí SCROLL_STATE_FLING. Cuando mi vista dejó de moverse, obtuve SCROLL_STATE_IDLE.

Pero, si durante el desplazamiento, alcanza View Top or Bottom, solo desplazo/fling valores y nunca el ralentí.

Revisé el proyecto de estantes de Romain Guy y su implementación sufren el mismo problema en 2.2.x Me pregunto si ya lo había notado.

no he probado todavía con 2.3.x

2

he encontrado algo de una solución para esto (al menos para el nivel de API 9+, donde todavía estoy viendo el error). Estoy usando un GridView, pero creo que esto también debería funcionar para ListView.

estoy usando una subclase de GridView donde estoy detectar la Permitir desplazamiento (superior o inferior):

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; 
    } 
} 

Entonces, en mi OnScrollListener de CustomGridView, que tienen:

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

    // ... 
} 

Ahora cuando estoy buscando OnScrollListener.SCROLL_STATE_IDLE, también compruebo si !gridView.isOverScrolled(). No estoy seguro de si eso soluciona los casos de uso específicos, pero con suerte puede usar la información adicional para determinar su estado actual a pesar del error.

0

He tenido este mismo problema y una solución publicado en la lista de errores por parte DeRagan: Link

Cuestiones relacionadas