Programowe przewijanie do określonej pozycji w widoku ListView systemu Android

Odpowiedzi:

386

W przypadku bezpośredniego przewijania:

getListView().setSelection(21);

Aby uzyskać płynne przewijanie:

getListView().smoothScrollToPosition(21);
HandlerExploit
źródło
Fajnie, właśnie tego chcę!
jiasli
Świetnie, bardzo przydatne, oszczędza mój czas. Dzięki.
Neha Agarwal
Inna różnica: pierwsza próbuje ustawić się na środku listy.
Victor Pinto
11
smoothScrollToPositionnie działa, jakaś sugestia?
SweetWisher ツ
1
@SweetWisher ツ spróbuj opublikować opóźnienie wykonania, na przykład:listView.post(() -> listView.smoothScrollToPosition());
Andy Res
64

Aby uzyskać płynne przewijanie z czasem przewijania:

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

Parametry
position -> Position to scroll to
offset ----> Żądana odległość w pikselach pozycji od góry widoku po zakończeniu przewijania
czas trwania -> Liczba milisekund do wykorzystania do przewijania

Uwaga: z API 11.

Odpowiedź HandlerExploit była tym, czego szukałem, ale mój widok listy jest dość długi i zawiera również przewijanie alfabetu. Potem stwierdziłem, że ta sama funkcja może przyjmować również inne parametry :)


Edytować: (z sugestii AFD)

Aby ustawić bieżący wybór:

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

mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration);  
amalBit
źródło
Działa w porządku. Aby poprawić odpowiedź, przesunięcie można obliczyć zgodnie z opisem na stackoverflow.com/questions/5540223/ ...
AFD,
co to jest v.getHeight ()?
Panache
@Panache v to wiersz widoku listy
amalBit
kocham cięuuuuu
Joao Ferreira
10

Umieść swój kod w module obsługi w następujący sposób,

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

a następnie wywołaj tę metodę w następujący sposób:

timerDelayRunForScroll(100);

TWOJE ZDROWIE!!!

Melbourne Lopes
źródło
7

Ustawiłem OnGroupExpandListener i zastąpiłem onGroupExpand () jako:

i użyj metody setSelectionFromTop (), która ustawia wybrany element i umieszcza zaznaczenie y pikseli od górnej krawędzi ListView. (W trybie dotykowym element nie zostanie wybrany, ale nadal będzie odpowiednio pozycjonowany) (dokumentacja systemu Android)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
    {

        @Override
        public void onGroupExpand(int groupPosition) {

            expList.setSelectionFromTop(groupPosition, 0);
            //your other code
        }
    });
Inet Labs
źródło
Muszę jednocześnie przewijać inny widok podczas przewijania lisview. Użycie setSelectionFromTop w widoku listy do przewijania blokuje wątek interfejsu użytkownika, co powoduje powolne przewijanie innego widoku. Czy możesz coś zasugerować, jak to zrobić?
VijayRaj
7

ListviewPrzewijania zostanie umieszczony na górze domyślnie, ale jeśli chcesz, aby przewinąć niewidoczny następnie użyj tego:

if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
            listView1.setSelection(position);
Zalak Gajjar
źródło
Dzięki @zalak Rozwiąż mój problem, daj spokój
Mitul Bhadeshiya
5

Jeśli ktoś szuka podobnej funkcji, takiej jak aplikacja Gmail,

Przewijanie widoku listy zostanie domyślnie umieszczone na górze. Dzięki za podpowiedź. amalBit. Po prostu odejmij to. Otóż ​​to.

 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
źródło
4

Obsługa listy Przeglądanie przewijania za pomocą przycisku W GÓRĘ / W DÓŁ

Jeśli ktoś jest zainteresowany obsługą listy, wyświetl jeden wiersz w górę / w dół za pomocą przycisku. następnie.

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
źródło
Daję ci głos pozytywny tylko dlatego, że jesteś jedyną osobą, która wskazała sposób na zdobycie obecnej pozycji, ale powinieneś poprawić przykład.
Panciz
4

Jeśli chcesz przejść bezpośrednio do żądanej pozycji w listView, po prostu użyj

listView.setSelection (pozycja int);

a jeśli chcesz płynnie przejść do żądanej pozycji w listView, po prostu użyj

listView.smoothScrollToPosition (pozycja int);

Vijay
źródło
3

To właśnie zadziałało dla mnie. Połączenie odpowiedzi AmalBit i 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); 
}

a następnie wywołaj tę metodę na przykład:

timerDelayRunForScroll(400);
Prasanna Ramaswamy
źródło
1

jego łatwy wybór list-view.set (pozujesz); lub możesz zapisać swoją pozycję z sharedprefrence, a kiedy zaczniesz aktywność, otrzymasz preferencje i ustawisz wybór na ten int

janatan
źródło
wszystko, co chciałem zrobić, to automatycznie przenieść się na górę listy, bez animacji przewijania ... to działało idealnie do tego
RH201
1

-Jeśli chcesz, aby lista przewinęła się w górę \ świt do określonej pozycji:

myListView.smoothScrollToPosition(i);

-jeśli chcesz uzyskać pozycję konkretnego elementu w myListView:

myListView.getItemAtPosition(i);

-Również to myListView.getVerticalScrollbarPosition(i);może ci pomóc.

Powodzenia :)

Basil Rawa
źródło
0

Do precyzyjnego zdefiniowania pozycji przewijania listView potrzebne są dwie rzeczy:

Aby uzyskać aktualną listę Wyświetl pozycję przewijania:

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

Aby ustawić pozycję przewijania widoku listy:

listView.setSelectionFromTop(firstVisiblePosition,0);
// Note the '-' sign for scrollTo.. 
listView.scrollTo(0,-topEdge);
Rahul Ogale
źródło
-1

Znalazłem to rozwiązanie, które umożliwia przewijanie w górę iw dół za pomocą dwóch różnych przycisków.

Zgodnie z sugestią @Nepster implementuję przewijanie programowo przy użyciu funkcji getFirstVisiblePosition () i getLastVisiblePosition (), aby uzyskać bieżącą pozycję.

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
źródło