Scorri a livello di programmazione fino a una posizione specifica in un ListView Android


157

Come posso scorrere programmaticamente fino a una posizione specifica in un ListView?

Ad esempio, ho un String[] {A,B,C,D....}e devo impostare l'elemento visibile in alto ListViewdell'indice sull'indice 21 del mio String[].



Risposte:


386

Per uno scorrimento diretto:

getListView().setSelection(21);

Per uno scorrimento uniforme:

getListView().smoothScrollToPosition(21);

Bene, questo è esattamente quello che voglio!
jiasli,

Fantastico, molto utile. Mi fa risparmiare tempo. Grazie.
Neha Agarwal,

Un'altra differenza: il primo tenta di posizionarsi in mezzo all'elenco.
Victor Pinto,

11
smoothScrollToPositionnon funziona, qualche suggerimento?
SweetWisher ツ

1
@SweetWisher ツ prova a postare l'esecuzione ritardata, qualcosa del tipo:listView.post(() -> listView.smoothScrollToPosition());
Andy Res

64

Per un SmoothScroll con durata dello scorrimento:

getListView().smoothScrollToPositionFromTop(position,offset,duration);


Posizione parametri -> Posizione per scorrere fino
all'offset ----> Distanza desiderata in pixel della posizione dalla parte superiore della vista al termine dello scorrimento-
> Numero di millisecondi da utilizzare per lo scorrimento

Nota: dall'API 11.

La risposta di HandlerExploit era ciò che stavo cercando, ma la mia lista è piuttosto lunga e anche con lo scroller alfabetico. Poi ho scoperto che la stessa funzione può accettare anche altri parametri :)


Modifica: (dal suggerimento AFD)

Per posizionare la selezione corrente:

int h1 = mListView.getHeight();
int h2 = listViewRow.getHeight();

mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration);  

Funziona bene. Per migliorare la risposta, l'offset può essere calcolato come descritto su stackoverflow.com/questions/5540223/…
AFD

che cos'è v.getHeight ()?
Panache

@Panache v è la riga della lista
amalBit

ti amouuuuu
Joao Ferreira,

10

Inserisci il codice nel gestore come segue,

public void timerDelayRunForScroll(long time) {
        Handler handler = new Handler(); 
        handler.postDelayed(new Runnable() {           
            public void run() {   
                try {
                    lstView.smoothScrollToPosition(YOUR_POSITION);
                } catch (Exception e) {}
            }
        }, time); 
    }

e quindi chiama questo metodo come

timerDelayRunForScroll(100);

SALUTI!!!


7

Ho impostato OnGroupExpandListener e sovrascrivo onGroupExpand () come:

e utilizzare il metodo setSelectionFromTop () che imposta l'elemento selezionato e posiziona la selezione y pixel dal bordo superiore di ListView. (Se in modalità touch, l'elemento non verrà selezionato ma verrà comunque posizionato in modo appropriato.) (Documenti Android)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
    {

        @Override
        public void onGroupExpand(int groupPosition) {

            expList.setSelectionFromTop(groupPosition, 0);
            //your other code
        }
    });

Ho bisogno di scorrere un'altra vista contemporaneamente mentre si scorre lisview. L'uso di setSelectionFromTop su listview per lo scorrimento blocca il thread dell'interfaccia utente che rallenta lo scorrimento di un'altra vista. Puoi darci qualche suggerimento su come farlo?
VijayRaj,

7

Lo Listviewscorrimento sarà posizionato in alto per impostazione predefinita, ma vuoi scorrere se non è visibile quindi usa questo:

if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
            listView1.setSelection(position);

Grazie @zalak Risolvi il mio problema,
Lasciati andare

5

Se qualcuno cerca una funzionalità simile come l'app Gmail,

Lo scorrimento Listview verrà posizionato in alto per impostazione predefinita. Grazie per il suggerimento. amalBit. Sottrailo e basta. Questo è tutto.

 Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            int h1 = mDrawerList.getHeight();
            int h2 = header.getHeight();
            mDrawerList.smoothScrollToPosition(h2-h1);
        }
    }, 1000);

4

Elenco di gestione Visualizza lo scorrimento utilizzando il pulsante SU / Giù utilizzando il pulsante

Se qualcuno è interessato a gestire l'elenco Visualizza una riga su / giù usando il pulsante. poi.

public View.OnClickListener onChk = new View.OnClickListener() {
             public void onClick(View v) {

                 int index = list.getFirstVisiblePosition();
                 getListView().smoothScrollToPosition(index+1); // For increment. 

}
});

Ti do il voto positivo solo perché sei l'unico che ha mostrato un modo per ottenere la posizione attuale, ma dovresti migliorare l'esempio.
Panciz,

4

Se si desidera saltare direttamente alla posizione desiderata in un elenco, basta usare

listView.setSelection (posizione int);

e se vuoi saltare senza intoppi alla posizione desiderata in listView basta usare

listView.smoothScrollToPosition (int position);


3

Questo è ciò che ha funzionato per me. Combinazione di risposte di amalBit e Melbourne Lopes

public void timerDelayRunForScroll(long time) {
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() {           
        public void run() {   
            try {
                  int h1 = mListView.getHeight();
                  int h2 = v.getHeight();

                  mListView.smoothScrollToPositionFromTop(YOUR_POSITION, h1/2 - h2/2, 500);  

            } catch (Exception e) {}
        }
    }, time); 
}

e quindi chiama questo metodo come:

timerDelayRunForScroll(400);

1

la sua facile selezione list-view.set (tu pos); oppure puoi salvare la tua posizione con sharedprefrenceand quando inizi l'attività ottieni preferenze e imposta elemosina a quell'int


tutto quello che volevo fare era spostarmi automaticamente in cima alla lista, senza alcuna animazione a scorrimento ... questo ha funzionato perfettamente per quello
RH201

1

-Se vuoi solo che l'elenco scorra verso l'alto \ alba fino a una posizione specifica:

myListView.smoothScrollToPosition(i);

-se desideri ottenere la posizione di un elemento specifico in myListView:

myListView.getItemAtPosition(i);

-anche questo myListView.getVerticalScrollbarPosition(i);può aiutarti.

In bocca al lupo :)


0

Sono necessari due elementi per definire con precisione la posizione di scorrimento di un elenco Visualizza:

Per ottenere l'elenco corrente Visualizzare la posizione di scorrimento:

int firstVisiblePosition = listView.getFirstVisiblePosition(); 
int topEdge=listView.getChildAt(0).getTop(); //This gives how much the top view has been scrolled.

Per impostare l'elenco Visualizza la posizione di scorrimento:

listView.setSelectionFromTop(firstVisiblePosition,0);
// Note the '-' sign for scrollTo.. 
listView.scrollTo(0,-topEdge);

-1

Ho trovato questa soluzione per consentire lo scorrimento su e giù usando due diversi pulsanti.

Come suggerito da @Nepster, implemento lo scorrimento a livello di codice usando getFirstVisiblePosition () e getLastVisiblePosition () per ottenere la posizione corrente.

final ListView lwresult = (ListView) findViewById(R.id.rds_rdi_mat_list);
    .....

        if (list.size() > 0) {
            ImageButton bnt = (ImageButton) findViewById(R.id.down_action);
            bnt.setVisibility(View.VISIBLE);
            bnt.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(lwresult.getLastVisiblePosition()<lwresult.getAdapter().getCount()){
                        lwresult.smoothScrollToPosition(lwresult.getLastVisiblePosition()+5);
                    }else{
                        lwresult.smoothScrollToPosition(lwresult.getAdapter().getCount());

                    }
                }
            });
            bnt = (ImageButton) findViewById(R.id.up_action);
            bnt.setVisibility(View.VISIBLE);

            bnt.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(lwresult.getFirstVisiblePosition()>0){
                        lwresult.smoothScrollToPosition(lwresult.getFirstVisiblePosition()-5);
                    }else{
                        lwresult.smoothScrollToPosition(0);
                    }

                }
            });
        }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.