Comment faire défiler vers le bas dans un ScrollView au démarrage de l'activité

96

J'affiche des données dans un ScrollView. Au démarrage de l'activité (méthode onCreate), je remplis le ScrollView avec des données et je veux faire défiler vers le bas.

J'ai essayé d'utiliser getScrollView().fullScroll(ScrollView.FOCUS_DOWN). Cela fonctionne lorsque je le fais comme une action sur un clic sur un bouton, mais cela ne fonctionne pas dans la méthode onCreate.

Existe-t-il un moyen de faire défiler le ScrollView vers le bas au démarrage de l'activité? Cela signifie que la vue défile déjà vers le bas lors de son premier affichage.

Palo
la source
Cela explique également pourquoi j'obtenais 0 tout le temps lorsque j'essayais d'utiliser getMeasuredWidth lors de l'initialisation de ma propre sous-classe d'un ScrollView.
Ghoti

Réponses:

218

Cela doit être fait comme suit:

    getScrollView().post(new Runnable() {

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

De cette façon, la vue est d'abord mise à jour, puis défile vers le «nouveau» bas.

Palo
la source
1
J'essaye exactement cela mais cela ne semble pas encore fonctionner ... appelez-vous le code ci-dessus dans onCreatele contenant Activity?
pstanton le
Je le fais dans onStart
Palo
4
À la place, post () utilise postDelayed () avec un délai de 100 ms. il fonctionnera à partir de n'importe quel point du cycle de vie de l'activité.
Vitaliy A
50

Mettez le code suivant après l'ajout de vos données:

final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
scrollview.post(new Runnable() {
    @Override
    public void run() {
        scrollview.fullScroll(ScrollView.FOCUS_DOWN);
    }
});
Harshid
la source
4
Pour moi, cela ne fonctionnait qu'avec un postDelayed au lieu d'un post. Seulement 100 millisecondes de retard.
Andreas Rudolph
Parfait. Bien sûr avec combo avec scrollview.fullScroll (ScrollView.FOCUS_UP);
ieselisra
30

Cela fonctionne pour moi:

scrollview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollview.post(new Runnable() {
            public void run() {
                scrollview.fullScroll(View.FOCUS_DOWN);
            }
        });
    }
});
Sonida
la source
2
Meilleure réponse à cette question jusqu'à présent. Beaucoup d'autres approches sont conditionnelles mais celle-ci est géniale et fonctionne très bien :)
rana
17

Vous pouvez le faire dans le fichier de mise en page:

                android:id="@+id/listViewContent"
                android:layout_width="wrap_content"
                android:layout_height="381dp" 
                android:stackFromBottom="true"
                android:transcriptMode="alwaysScroll">
Tam Dao
la source
8
 scrollView.postDelayed(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    },1000);
Makvin
la source
4

Essaye ça

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

Juste après avoir ajouté des données à la vue, ajoutez cette seule ligne:

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);
LEMUEL ADANE
la source
1

Après avoir initialisé votre composant d'interface utilisateur et le remplir de données. ajoutez ces lignes à votre méthode on create

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

C'est la meilleure façon de procéder.

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