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.

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

Palo
źródło
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);
    }
});
Ostry
źródło
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);
            }
        });
    }
});
sonida
źródło
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">
Tam Dao
źródło
8
 scrollView.postDelayed(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    },1000);
Makvin
źródło
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);
       }
    });
BLA
źródło
3

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

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);
LEMUEL ADANE
źródło
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);
Ramzy Hassan
źródło
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);
                }
            });
        }
});
rana
źródło