2010-07-22 5 views
85

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.Comment faire défiler vers le bas dans un ScrollView au démarrage de l'activité

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

Existe-t-il un moyen de faire défiler le défilement vers le bas au démarrage de l'activité? Cela signifie que la vue est déjà défilée vers le bas lors de la première affichage.

+0

Cela explique aussi pourquoi je recevais 0 tout le temps quand je tentais d'utiliser getMeasuredWidth alors que ma propre sous-classe initialisant d'un ScrollView. – Ghoti

Répondre

196

Il doit se faire comme suit:

getScrollView().post(new Runnable() { 

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

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

+1

J'essaye exactement cela mais cela ne semble pas fonctionner encore ... appelez-vous le code ci-dessus dans 'onCreate' de la' Activity' contenant? – pstanton

+0

Je le fais dans onStart – Palo

+3

Au lieu de post(), utilisez postDelayed() avec un retard de 100ms. il fonctionnera à partir de n'importe quel point de cycle de vie des activités. –

15

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"> 
+0

Cela a effectivement fonctionné pour moi! Props! –

+0

C'est génial! :) –

+8

Cela ne fonctionne que si votre vue de défilement est une vue de liste. –

42

Mettre le code suivant après vos données est ajouté:

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

Pour moi cela ne fonctionnait qu'avec un postDelayed au lieu de poster. Juste 100 millisecondes de retard. –

+0

Parfait. Bien sûr, avec combo avec scrollview.fullScroll (ScrollView.FOCUS_UP); – KNU

25

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

Génial. Merci. – Proverbio

+1

Meilleure réponse pour cette question jusqu'à présent. Beaucoup d'autres approches sont conditionnelles mais celui-ci est génial n fonctionne très bien :) – rana

3

Juste après vous ajoutez des données à la vue ajoutez cette ligne unique:

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN); 
+0

a travaillé pour moi :) – Smaran

3

Essayez cette

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

Ceci est la meilleure façon de le faire.

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

         } 
        }); 
       } 
1

Après l'initialisation de votre composant d'interface utilisateur et le remplir avec des données. ajoutez les ligne à votre méthode de créer

Runnable runnable=new Runnable() { 
     @Override 
     public void run() { 
      scrollView.fullScroll(ScrollView.FOCUS_DOWN); 
     } 
    }; 
    scrollView.post(runnable); 
0
scrollView.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      scrollView.fullScroll(ScrollView.FOCUS_DOWN); 
     } 
    },1000); 
Questions connexes