2013-02-17 1 views
5

Ho diversi colori per diverse linee in ListView, impostando il colore della casella di testo in base al numero di riga (in getView() di Adapter). Ora quando faccio scorrere manualmente il ListView verso l'alto, il colore corretto viene visualizzato nelle linee di fondo che vengono rivelate. Ma quando uso scrollTo, questo non accade, tutte le linee rivelate hanno lo stesso colore (non sono aggiornate).Quando si utilizza scrollTo ListView non si aggiorna, ma quando lo scorre manualmente si aggiorna

Qualcuno ha affrontato questo problema? Questo sembra sconcertante!

risposta

3

ListView#scrollTo non scorre il contenuto della lista. (È un metodo di visualizzazione standard e non specifico per gli elenchi: scorre la vista ListView stessa.)

Invece, provare a utilizzare ListView#setSelectionFromTop(0, int y) per scorrere.

API 19+ ha un metodo ListView#scrollListBy(int y) se si sta programmando per KitKat e versioni successive.

+0

Sto cercando la stessa soluzione .... scrollTo non aggiorna il listview content..And utilizzando setSelectionFromTop non scorre il listview .... I avere il valore 'y' ma non so quale posizione scorrere ... Qualche idea? – VijayRaj

+0

Se si utilizza 'setSelectionFromTop (int posittion, int y)' con una posizione di 0, 'ListView' si sposterà all'inizio dell'elenco. Il valore 'y' è la distanza dal bordo superiore dell'elemento ListView. (Potrebbe essere necessario annullare il valore 'y'.) – Makario

+0

Ho provato' setSelectionFromTop (int posittion, int y) 'con la posizione come 0, ma l'elenco rimane nella prima posizione (non scorre) indipendentemente dalla' y 'valore .... – VijayRaj

0

Nel nostro progetto ListView#setSelectionFromTop(0, int y) non ha alcun effetto. Così abbiamo hacking questo compat-style:

class Hacks { 

static { 
    Method trackMotionScroll = null; 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { 
     try { 
      trackMotionScroll = AbsListView.class 
        .getDeclaredMethod("trackMotionScroll", int.class, int.class); 
      trackMotionScroll.setAccessible(true); 
     } catch (NoSuchMethodException e) { 
      Exceptions.crash(e); 
     } 
    } 
    listViewTrackMotionScroll = trackMotionScroll; 
} 

public static void scrollListBy(ListView listView, int y) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     listView.scrollListBy(y); 
    } else { 
     try { 
      listViewTrackMotionScroll.invoke(listView, -y, -y); 
     } catch (Exception e) { 
      Exceptions.crash(e); 
     } 
    } 
} 
}