2010-01-01 12 views
25

Esiste un modo per garantire che un dato elemento in una listview di Android sia completamente visibile?assicurare visibile su listview android?

Mi piacerebbe essere in grado di scorrere a livello di programmazione su un elemento specifico, ad esempio quando premo un pulsante.

risposta

20

ListView.setSelection() scorre l'elenco in modo che l'elemento desiderato si trovi all'interno del riquadro.

+4

La selezione di insiemi fa scorrere verso l'alto della vista. Ho solo bisogno che si muova il meno possibile – CodeFusionMobile

+0

Questa risposta non è accurata, come indicato da CodeFusionMobile. Quindi non lo accetterei davvero ... :-( – Zordid

11

Prova ora:

public static void ensureVisible(ListView listView, int pos) 
{ 
    if (listView == null) 
    { 
     return; 
    } 

    if(pos < 0 || pos >= listView.getCount()) 
    { 
     return; 
    } 

    int first = listView.getFirstVisiblePosition(); 
    int last = listView.getLastVisiblePosition(); 

    if (pos < first) 
    { 
     listView.setSelection(pos); 
     return; 
    } 

    if (pos >= last) 
    { 
     listView.setSelection(1 + pos - (last - first)); 
     return; 
    } 
} 
+6

listView.smoothScrollToPosition (pos), invece di setSelection (...) se vuoi.Grazie jauseg. – Saikat

+0

+1 grazie per questo! – Olayinka

+0

Hmm. almeno una trappola qui: nel caso in cui si imposta la selezione prima che il layout sia stato fatto - non ci sarà l'ultima posizione visibile (= -1) e tutto si interromperà. È necessario assicurarsi che questo venga eseguito DOPO che il layout è stato eseguito. non funziona come previsto ma imposta la selezione completamente errata – Zordid

2

Ho una soluzione più breve e, a mio parere, migliore per farlo: il metodo ListView requestChildRectangleOnScreen è progettato per questo.

La risposta sopra assicura che l'elemento verrà visualizzato, ma a volte verrà visualizzato parzialmente (cioè quando si trova nella parte inferiore dello schermo). Il seguente codice garantisce che l'intero oggetto verrà visualizzato e che la vista scorrerà solo la zona necessaria:

private void ensureVisible(ListView parent, View view) { 
    Rect rect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); 
    parent.requestChildRectangleOnScreen(view, rect, false); 
} 
+7

Se si utilizza API 8 o successivo, il metodo smoothScrollToPosition() di ListView è ancora più intelligente. –

+0

Il problema con Yves 'la risposta è che questa 'View' non esiste necessariamente ... se non è visibile,' ListView' molto probabilmente lo avrà scartato. Infatti, 'smoothScrollToPosition' è il bello rispondi qui. – RedGlyph

3

Di recente ho incontrato lo stesso problema, incollare la mia soluzione qui in caso qualcuno bisogno (stavo cercando di rendere visibile l'intero ultimo elemento visibile):

+0

Funziona alla grande! Anche se dovrei menzionare un caso limite che richiede un cambio di codice: devi chiamare mListView.post (new Runnable() {public void run() {(il codice sopra);})}); Questo gestisce il caso in cui stai modificando l'altezza dell'ultimo bambino (rendendo così più alto il contenuto di ListView). Pubblicare un runnable dà a ListView la possibilità di aggiornarsi prima di provare a scorrere fino alla nuova parte inferiore dell'elenco. – foo64

+1

Sfortunatamente c'è un limite interno alla quantità che 'ListView.smoothScrollBy' scorrerà. Questo perché internamente simula un'avventura dell'utente. L'utilizzo di questo metodo per scorrere 10 schermate di elementi consente di scorrere solo di alcune schermate. – foo64

Problemi correlati