web-dev-qa-db-fra.com

Comment faire défiler vers le haut de la disposition longue ScrollView?

Pour une partie de mon application, une liste de noms est présentée à l'utilisateur. Il lui est demandé de les regrouper à sa guise. 

(Remarque, le code de ListView a été copié textuellement à partir du didacticiel d'Android Views. Je ne l'ai pas encore adapté à mes besoins. J'essaie simplement de comprendre comment faire pour que cela fonctionne.)

La présentation de base est un LinearLayout, contenant un ScrollView (appelé "groupsScrollView" dans le code ci-dessous), contenant un RelativeLayout. J'ai quelques boutons et du texte, puis mon ListView dessous, qui affiche la liste des noms. Tout cela est plus haut que la zone d'écran visible, de sorte que l'utilisateur est autorisé à faire défiler verticalement pour voir tout.

Tout cela fonctionne à merveille, sauf que lorsque la page est chargée, elle est toujours précédée d'un défilement vers le haut de mon ListView - au milieu de la page. Le texte et les boutons que j'ai créés qui indiquent à l'utilisateur quoi faire ne sont pas visibles. 

Je peux saisir l'écran et faire défiler vers le haut, cela fonctionne très bien, mais j'aimerais que l'écran se charge après avoir déjà fait défiler vers le haut. L'utilisateur ne devrait pas avoir à faire défiler vers le haut pour voir le haut d'une page fraîchement chargée. Mais tout ce que j'ai essayé de faire défiler par programme en haut de l'écran a échoué.

Voici ma méthode onCreate:

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.groups);

    mainScrollView = (ScrollView)findViewById(R.id.groupsScrollView);

    //get the Bundle out of the Intent...
    Bundle extras = getIntent().getExtras();
    mNames = extras.getStringArray("mNames");

    setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, mNames));

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);

    //This is the line I'm having issues with
    mainScrollView.pageScroll(View.FOCUS_UP);

    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
          // When clicked, show a toast with the TextView text
          Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
              Toast.LENGTH_SHORT).show();
        }
      });
}

La ligne "mainScrollView.pageScroll (View.FOCUS_UP)" est le problème. Elle ne provoque pas d'erreur, mais ne semble rien y faire. J'ai essayé scrollTo (0,0), scrollDirection (View.FOCUS_UP ), et tout ce que je peux penser. 

Étant donné que je ne reçois pas d'erreur, je dois supposer que ces commandes de défilement fonctionnent réellement, mais qu'elles défilent vers le haut de la liste, plutôt que vers le haut de la molette ScrollView ou RelativeLayout qui la contient. Cela semble être confirmé par la propre description de Google de la méthode scrollTo (int x, int y) où ils disent "Cette version fixe également le défilement aux limites de notre enfant". 

Donc, pour prolonger une longue question, comment puis-je charger une série de vues sur l’écran contenu dans une vue ScrollView, puis faire défiler par programme le tout en haut de la page afin que l’utilisateur puisse interagir avec celle-ci?

Merci!

143
Glenn

Essayer 

mainScrollView.fullScroll(ScrollView.FOCUS_UP);

ça devrait marcher.

237
roomtek

Avait le même problème, probablement une sorte de bug. 

Même le fullScroll(ScrollView.FOCUS_UP) de l'autre réponse n'a pas fonctionné .
La seule chose qui a fonctionné pour moi était d'appeler scroll_view.smoothScrollTo(0,0) juste après l'affichage de la boîte de dialogue.

162
Mohamed Hafez

j'ai eu le même problème et cela a résolu le problème. J'espère que ça vous aide.

listView.setFocusable(false);
92
Miguel Palacios

scrollViewObject.fullScroll(ScrollView.FOCUS_UP) Cela fonctionne bien, mais le seul problème avec cette ligne est que, lorsque les données sont remplies dans scrollViewObject, a été appelée immédiatement. Vous devez attendre quelques millisecondes jusqu'à ce que les données soient renseignées. Essayez ce code:

scrollViewObject.postDelayed(new Runnable() {
    @Override
    public void run() {
        scroll.fullScroll(ScrollView.FOCUS_UP);
    }
}, 600);

OR

 scrollViewObject.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollViewObject.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        scrollViewObject.fullScroll(View.FOCUS_UP);
    }
});
47
Mohammad Imran

Le principal problème de toutes ces solutions valables est que vous essayez de monter le parchemin quand il n’est pas encore dessiné à l’écran.

Vous devez attendre que l'affichage défilement apparaisse à l'écran, puis déplacez-le vers le haut avec l'une de ces solutions. C'est une meilleure solution qu'un post-retard, car le retard ne vous gêne pas.

    // Wait until my scrollView is ready
    scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // Ready, move up
            scrollView.fullScroll(View.FOCUS_UP);
        }
    });
32
Pelanes

Très facile

    ScrollView scroll = (ScrollView) findViewById(R.id.addresses_scroll);
    scroll.setFocusableInTouchMode(true);
    scroll.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
27
CommonSenseCode

J'ai rencontré le même problème Lorsque j'utilise Scrollview dans View Flipper ou Dialog, cette casse scrollViewObject.fullScroll(ScrollView.FOCUS_UP) renvoie false de sorte que la casse scrollViewObject.smoothScrollTo(0, 0) soit résolue pour moi

Haut de défilement

23
sravan
 final ScrollView scrollview = (ScrollView)findViewById(R.id.selected_place_layout_scrollview);

         scrollview.post(new Runnable() { 
                public void run() { 
                    scrollview.scrollTo(0, 0); 
                } 
            }); 
18
Mladen Rakonjac
runOnUiThread( new Runnable(){
   @Override
   public void run(){
      mainScrollView.fullScroll(ScrollView.FOCUS_UP);
   }
}
9
traeper

C'est forcer le défilement pour scrollview :

            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.scrollTo(0, 0);
                    scrollView.pageScroll(View.FOCUS_UP);
                    scrollView.smoothScrollTo(0,0);
                }
            });
5
Hadi Note

Cela a fonctionné pour moi

scroll_view.smoothScrollTo(0,0); // scroll to top of screen
4
Pankaj Talaviya
scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // Ready, move up
        scrollView.fullScroll(View.FOCUS_UP);
    }
});
2
user9271802
@SuppressWarnings({ "deprecation", "unchecked" })
public void swipeTopToBottom(AppiumDriver<MobileElement> driver) 
                    throws InterruptedException {
       Dimension dimensions = driver.manage().window().getSize();
        Double screenHeightStart = dimensions.getHeight() * 0.30;
        int scrollStart = screenHeightStart.intValue();
        System.out.println("s="+scrollStart);
        Double screenHeightEnd = dimensions.getHeight()*0.90;
        int scrollEnd = screenHeightEnd.intValue();
        driver.swipe(0,scrollStart,0,scrollEnd,2000);
        CommonUtils.threadWait(driver, 3000);
    }
0
Ajeet Gour