2010-06-09 15 views
12

Ho un problema con la versione 2.1 di Android. Sembra un insetto.android: AbsListView.OnScrollListener SCROLL_STATE_IDLE non viene chiamato dopo SCROLL_STATE_TOUCH_SCROLL (Versione 2.1)

Ho allegato un OnScrollListener alla mia lista.

Sto utilizzando il metodo onScrollStateChanged(AbsListView view, int scrollState) per il monitoraggio dello stato di scroll della mia listview.

Lo scrollstate potrebbe assumere 3 value (tratto dalla documentazione):

  1. SCROLL_STATE_FLING: l'utente aveva precedentemente scorre utilizzando tatto e aveva eseguito una scappatella. L'animazione è ora arresto per inerzia
  2. SCROLL_STATE_IDLE: La vista non è scorrimento. Nota la navigazione nell'elenco utilizzando il conteggio trackball come in stato di inattività poiché queste transizioni non sono animate.
  3. SCROLL_STATE_TOUCH_SCROLL: l'utente scorre con tatto, e il loro dito è ancora sullo schermo

Suppongo che il SCROLL_STATE_IDLE sarà sempre approvata dopo che uno dei due altri stati. È sempre vero tranne per Android versione 2.1. SCROLL_STATE_IDLE non è passato dopo SCROLL_STATE_TOUCH_SCROLL Il problema si verifica anche se si arresta il Fling da un tocco invece di lasciare che la fermata di scorrimento per sé. Questo strano comportamento lascia il mio listView in uno stato non riconosciuto.

Qualcuno ha lo stesso problema? Suggerimenti per un lavoro "non così sporco" in giro?

+0

Non è stato ancora risolto? – st0le

risposta

2

ho avuto un problema simile sul 2.2.

Se l'elenco è abbastanza grande e si scorre verso il basso, ho ottenuto il primo CROLL_STATE_TOUCH_SCROLL mentre il mio dito è sullo schermo. Quando il mio dito lascia lo schermo ho ottenuto il SCROLL_STATE_FLING. Quando la mia vista si è arrestata, ho ricevuto SCROLL_STATE_IDLE.

Ma, se durante lo scorrimento, raggiunge Vista superiore o inferiore, I valori di scorrimento/lancio solo e mai il minimo.

Ho controllato il progetto Shelves di Romain Guy e la sua implementazione ha subito lo stesso problema in 2.2.x Mi chiedo se non l'avesse ancora notato.

non ho ancora provato con 2.3.x

2

ho trovato qualcosa di una soluzione per questo (almeno per il livello di API 9+, dove sto ancora vedendo il bug). Sto usando un GridView, ma credo che questo dovrebbe funzionare anche per ListView.

sto usando una sottoclasse di GridView dove sto rilevando l'Overscroll (superiore o inferiore):

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

Poi, nel mio OnScrollListener di CustomGridView, ho:

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

    // ... 
} 

Ora quando sto controllando per OnScrollListener.SCROLL_STATE_IDLE, controllo anche se !gridView.isOverScrolled(). Non sono sicuro che questo risolva i casi d'uso specifici, ma spero che tu possa utilizzare l'informazione aggiuntiva per determinare il tuo stato attuale nonostante l'errore.

0

Ho avuto questo stesso problema e pubblicato una soluzione sulla lista bug citato da DeRagan: Link

Problemi correlati