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[].

Maxime
quelle
Siehe meine Antwort hier, stackoverflow.com/a/29345217/1881527
Melbourne Lopes

Antworten:

386

Für eine direkte Schriftrolle:

getListView().setSelection(21);

Für eine reibungslose Schriftrolle:

getListView().smoothScrollToPosition(21);
HandlerExploit
quelle
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);  
amalBit
quelle
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!!!

Melbourne Lopes
quelle
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
        }
    });
Inet Labs
quelle
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);
Zalak Gajjar
quelle
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);
EngineSense
quelle
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. 

}
});
Zar E Ahmer
quelle
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);

Vijay
quelle
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);
Prasanna Ramaswamy
quelle
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

Janatan
quelle
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 :)

Basil Rawa
quelle
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);
Rahul Ogale
quelle
-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);
                    }

                }
            });
        }
Panciz
quelle