Jak przewijać w dół w ScrollView podczas uruchamiania działania


96

Wyświetlam niektóre dane w ScrollView. Podczas uruchamiania działania (metoda onCreate) wypełniam ScrollView danymi i chcę przewinąć do dołu.

Próbowałem użyć getScrollView().fullScroll(ScrollView.FOCUS_DOWN). Działa to, gdy robię to jako akcja po kliknięciu przycisku, ale nie działa w metodzie onCreate.

Czy istnieje sposób, jak przewinąć ScrollView do dołu po uruchomieniu działania? Oznacza to, że widok jest już przewijany do dołu przy pierwszym wyświetleniu.


To wyjaśnia również, dlaczego otrzymywałem 0 przez cały czas, gdy próbowałem użyć metody getMeasuredWidth podczas inicjowania własnej podklasy ScrollView.
Ghoti

Odpowiedzi:


218

Należy to zrobić w następujący sposób:

    getScrollView().post(new Runnable() {

        @Override
        public void run() {
            getScrollView().fullScroll(ScrollView.FOCUS_DOWN);
        }
    });

W ten sposób widok jest najpierw aktualizowany, a następnie przewijany do „nowego” dołu.


1
Próbuję dokładnie tego, ale wydaje się, że nadal nie działa ... czy wywołujesz powyższy kod w onCreatepliku zawierającym Activity?
pstanton

Robię to w onStart
Palo

4
Zamiast post () użyj postDelayed () z opóźnieniem 100 ms. będzie działać z dowolnego punktu cyklu życia czynności.
Vitaliy A

50

Umieść następujący kod po dodaniu danych:

final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
scrollview.post(new Runnable() {
    @Override
    public void run() {
        scrollview.fullScroll(ScrollView.FOCUS_DOWN);
    }
});

4
U mnie działało to tylko z postDelayed zamiast post. Zaledwie 100 milisekund opóźnienia.
Andreas Rudolph

Idealny. Oczywiście z combo z scrollview.fullScroll (ScrollView.FOCUS_UP);
ieselisra

30

To działa dla mnie:

scrollview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollview.post(new Runnable() {
            public void run() {
                scrollview.fullScroll(View.FOCUS_DOWN);
            }
        });
    }
});

2
Jak dotąd najlepsza odpowiedź na to pytanie. Wiele innych podejść jest warunkowych, ale ta jest niesamowita n działa bardzo dobrze :)
rana

17

Możesz to zrobić w pliku układu:

                android:id="@+id/listViewContent"
                android:layout_width="wrap_content"
                android:layout_height="381dp" 
                android:stackFromBottom="true"
                android:transcriptMode="alwaysScroll">

8
 scrollView.postDelayed(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    },1000);

4

Spróbuj tego

    final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
    scrollview.post(new Runnable() {
       @Override
       public void run() {
         scrollview.fullScroll(ScrollView.FOCUS_DOWN);
       }
    });

3

Zaraz po dołączeniu danych do widoku dodaj tę pojedynczą linię:

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);

1

Po zainicjowaniu komponentu UI i wypełnieniu go danymi. dodaj te linie do swojej metody on create

Runnable runnable=new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    };
    scrollView.post(runnable);

1

To najlepszy sposób na zrobienie tego.

scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.fullScroll(View.FOCUS_DOWN);
                }
            });
        }
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.