Comment faire défiler vers le haut de la longue mise en page ScrollView?

Pour une partie de mon application, l'utilisateur reçoit une liste de noms et il est demandé de les regrouper comme bon leur semble.

(Notez que le code ListView a été copié textuellement à partir du didacticiel Android Views. Je ne l'ai pas encore personnalisé à mes besoins, j'essaie simplement de comprendre comment cela fonctionne.)

  • "Démarrage de l'émulateur pour AVD" puis Panic: impossible d'ouvrir ... "
  • Java missing required source folder: 'gen'
  • Envoyer un événement tactile depuis ADB vers un périphérique
  • Android-studio L'annuaire sélectionné n'est pas valide pour Android SDK
  • La méthode OnCreate continue d'être appelée à plusieurs reprises
  • Comment afficher la broche de localisation de la partie visible d'une vue de carte dans Android?
  • La disposition de base est LinearLayout, contenant une ScrollView (appelée "groupsScrollView" dans le code ci-dessous), contenant un RelativeLayout. J'ai des boutons et du texte, puis mon ListView sous celui-ci, qui affiche la liste des noms. Tout cela est plus grand que la zone d'écran visible, de sorte que l'utilisateur peut défiler verticalement pour le voir tout.

    Tout cela fonctionne très bien, sauf lorsque la page est chargée, elle est toujours pré-décalée vers le haut de mon ListView – au milieu de la page. Le texte et les boutons que j'ai créés indiquent à l'utilisateur ce qu'il faut faire ne sont pas visibles.

    Je peux attraper l'écran et faire défiler vers le haut, cela fonctionne très bien, mais j'aimerais que l'écran se charge d'avoir déjà été défilé vers le haut. L'utilisateur ne doit pas nécessairement se déplacer vers le haut pour voir le haut d'une page nouvellement chargée. Mais tout ce que j'ai essayé de passer par programme vers le 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. Cela ne provoque pas d'erreur, mais il ne semble rien faire. J'ai essayé scrollTo (0,0), scrollDirection (View.FOCUS_UP) ), Et tout ce que je peux penser.

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

    Donc, pour faire une longue question encore plus longtemps, comment puis-je charger un tas de vues sur l'écran contenu dans une ScrollView, puis déplacer par programme le tout vers le haut de la page afin que l'utilisateur puisse interagir avec elle?

    Merci!

  • Comment mettre un runnable en bundle?
  • Ajouter maven repository à build.gradle
  • Comment utiliser MediaCodec sans MediaExtractor pour H264
  • Arrêter / arrêter et démarrer / reprendre Java TimerTask en continu?
  • Puis-je ouvrir la disposition du tiroir avec une animation par programme?
  • Android Studio Gradle nouveau "appliquer un plugin"
  • 10 Solutions collect form web for “Comment faire défiler vers le haut de la longue mise en page ScrollView?”

    essayer

     mainScrollView.fullScroll(ScrollView.FOCUS_UP); 

    Ça devrait fonctionner.

    A eu le même problème, probablement une sorte de bogue.

    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 la boîte de dialogue s'affiche.

    J'ai eu le même problème et cela l'a corrigé. J'espère que cela vous aidera.

     listView.setFocusable(false); 

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

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

    OU

      scrollViewObject.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { scrollViewObject.getViewTreeObserver().removeOnGlobalLayoutListene‌​r(this); scrollViewObject.fullScroll(View.FOCUS_UP); } }); 

    Le problème principal pour toutes ces solutions valides est que vous essayez de déplacer le défilement lorsqu'il n'est pas encore dessiné sur l'écran.

    Vous devez attendre que la vue de défilement soit à l'écran, puis la déplacer vers le haut avec l'une de ces solutions. C'est une meilleure solution qu'un post-retard, parce que vous ne vous en faites pas du retard.

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

    J'ai fait face au même problème Lorsque j'utilise Scrollview à l'intérieur de View Flipper ou Dialog that case scrollViewObject.fullScroll(ScrollView.FOCUS_UP) renvoie false afin que case scrollViewObject.smoothScrollTo(0, 0) soit Worked for me

    Scroll Focus Top

    Très facile

      ScrollView scroll = (ScrollView) findViewById(R.id.addresses_scroll); scroll.setFocusableInTouchMode(true); scroll.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); 
      final ScrollView scrollview = (ScrollView)findViewById(R.id.selected_place_layout_scrollview); scrollview.post(new Runnable() { public void run() { scrollview.scrollTo(0, 0); } }); 
     runOnUiThread( new Runnable(){ @Override public void run(){ mainScrollView.fullScroll(ScrollView.FOCUS_UP); } } 
     @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); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.