Scrollen Sie programmgesteuert zu einer bestimmten Position in einer Android ListView


157

Wie kann ich programmgesteuert zu einer bestimmten Position in einem scrollen ListView?

Zum Beispiel habe ich eine String[] {A,B,C,D....}, und ich muss das oberste sichtbare Element von ListViewauf den Index 21 von my setzen String[].



Antworten:


386

Für eine direkte Schriftrolle:

getListView().setSelection(21);

Für eine reibungslose Schriftrolle:

getListView().smoothScrollToPosition(21);

Cool, genau das will ich!
Jiasli

Großartig, sehr nützlich. Es spart meine Zeit. Vielen Dank.
Neha Agarwal

Ein weiterer Unterschied: Der erste versucht, in die Mitte der Liste zu setzen.
Victor Pinto

11
smoothScrollToPositionfunktioniert nicht, irgendein Vorschlag?
SweetWisher

1
@SweetWisher ツ versuchen, die Ausführung zu verzögern, so etwas wie:listView.post(() -> listView.smoothScrollToPosition());
Andy Res

64

Für einen SmoothScroll mit Bildlaufdauer:

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

Parameter
Position -> Position zum
Scrollen zum Versatz ----> Gewünschter Abstand in Pixel der Position vom oberen Rand der Ansicht, wenn der Bildlauf abgeschlossen ist
Dauer-> Anzahl der Millisekunden, die für den Bildlauf verwendet werden sollen

Hinweis: Ab API 11.

Die Antwort von HandlerExploit war genau das, wonach ich gesucht habe, aber meine Listenansicht ist ziemlich lang und auch mit Alphabet-Scroller. Dann habe ich festgestellt, dass dieselbe Funktion auch andere Parameter annehmen kann :)


Bearbeiten: (Aus AFDs Vorschlag)

So positionieren Sie die aktuelle Auswahl:

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

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

Funktioniert gut. Um Ihre Antwort zu verbessern, kann der Offset wie unter stackoverflow.com/questions/5540223/…
AFD

Was ist v.getHeight ()?
Panache

@Panache v ist die Zeile der Listenansicht
amalBit

Ich liebe dichuuuuu
Joao Ferreira

10

Geben Sie Ihren Code wie folgt in den Handler ein:

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

und rufen Sie diese Methode dann wie folgt auf:

timerDelayRunForScroll(100);

PROST!!!


7

Ich habe OnGroupExpandListener festgelegt und onGroupExpand () wie folgt überschrieben:

Verwenden Sie die Methode setSelectionFromTop (), mit der das ausgewählte Element festgelegt und die Auswahl y Pixel vom oberen Rand der ListView positioniert wird. (Im Touch-Modus wird das Element nicht ausgewählt, aber dennoch entsprechend positioniert.) (Android-Dokumente)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
    {

        @Override
        public void onGroupExpand(int groupPosition) {

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

Ich muss gleichzeitig eine andere Ansicht scrollen, während ich durch die Ansicht scrolle. Die Verwendung von setSelectionFromTop in der Listenansicht zum Scrollen blockiert den UI-Thread, wodurch das Scrollen einer anderen Ansicht verlangsamt wird. Können Sie einen Vorschlag machen, wie es geht?
VijayRaj

7

Der ListviewBildlauf wird standardmäßig nach oben positioniert, Sie möchten jedoch einen Bildlauf durchführen, wenn er nicht sichtbar ist. Verwenden Sie dann Folgendes:

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

Danke @zalak Löse mein Problem, gib dich auf
Mitul Bhadeshiya

5

Wenn jemand nach einer ähnlichen Funktionalität wie der Google Mail-App sucht,

Der Listenansicht-Bildlauf wird standardmäßig nach oben positioniert. Danke für den Tipp. amalBit. Subtrahiere es einfach. Das ist es.

 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

Umgang mit ListView-Scrollen mit UP / Down mit der Taste

Wenn jemand daran interessiert ist, listView eine Zeile nach oben / unten mit der Schaltfläche. dann.

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

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

}
});

Ich gebe Ihnen die Up-Abstimmung, nur weil Sie der einzige sind, der einen Weg aufgezeigt hat, um die aktuelle Position zu erreichen, aber Sie sollten das Beispiel verbessern.
Panciz

4

Wenn Sie in einer Listenansicht direkt zur gewünschten Position springen möchten, verwenden Sie einfach

listView.setSelection (int position);

und wenn Sie reibungslos zur gewünschten Position in listView springen möchten, verwenden Sie einfach

listView.smoothScrollToPosition (int position);


3

Das hat bei mir funktioniert. Kombination der Antworten von amalBit & 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); 
}

und rufen Sie diese Methode dann wie folgt auf:

timerDelayRunForScroll(400);

1

seine einfache list-view.set Auswahl (Sie pos); oder Sie können Ihre Position mit sharedprefrencean speichern und beim Starten der Aktivität Einstellungen und Einstellungen auf diesen int erhalten


Alles, was ich tun wollte, war automatisch an den Anfang der Liste zu gelangen, ohne Scroll-Animation ... das funktionierte perfekt dafür
RH201

1

-Wenn Sie nur möchten, dass die Liste nach oben zu einer bestimmten Position rollt:

myListView.smoothScrollToPosition(i);

-wenn Sie die Position eines bestimmten Elements in myListView abrufen möchten:

myListView.getItemAtPosition(i);

-auch das myListView.getVerticalScrollbarPosition(i);kann dir helfen.

Viel Glück :)


0

Sie benötigen zwei Dinge, um die Bildlaufposition einer listView genau zu definieren:

So erhalten Sie die aktuelle listView-Bildlaufposition:

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

So legen Sie die listView-Bildlaufposition fest:

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

-1

Ich habe diese Lösung gefunden, um das Scrollen mit zwei verschiedenen Tasten nach oben und unten zu ermöglichen.

Wie von @Nepster vorgeschlagen, implementiere ich den Bildlauf programmgesteuert mit getFirstVisiblePosition () und getLastVisiblePosition (), um die aktuelle Position abzurufen.

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

                }
            });
        }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.