Pour une partie de mon application, l'utilisateur reçoit une liste de noms et est invité à les regrouper comme il l'entend.
(Notez que le code ListView a été copié textuellement à partir du didacticiel Android Views. Je ne l'ai pas encore personnalisé en fonction de mes besoins, j'essaie simplement de comprendre comment faire fonctionner cela.)
La disposition 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 ma ListView en dessous, qui affiche la liste des noms. Tout cela est plus grand que la zone d'écran visible, de sorte que l'utilisateur est autorisé à faire défiler verticalement pour tout voir.
Tout cela fonctionne à merveille, sauf lorsque la page se charge, elle est toujours pré-défilée vers le haut de ma 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à été défilé 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 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. Elle ne provoque pas d'erreur, mais elle ne semble rien faire. J'ai essayé scrollTo (0,0), scrollDirection (View.FOCUS_UP ), et tout ce à quoi je peux penser.
Comme je n'obtiens 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 ListView, plutôt que vers le haut de ScrollView ou RelativeLayout qui le contient. Ceci semble être confirmé par la propre description de Google de la méthode scrollTo (int x, int y) où ils disent "Cette version limite également le défilement aux limites de notre enfant.".
Donc, pour prolonger encore une longue question, comment charger un groupe de vues sur l'écran contenues dans un ScrollView, puis faire défiler le tout par programme vers le haut de la page afin que l'utilisateur puisse interagir avec lui?
Merci!
la source
Eu le même problème, probablement une sorte de bogue.
Même la
fullScroll(ScrollView.FOCUS_UP)
réponse 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.la source
fullScroll()
de conserver l'élément sélectionné toujours sélectionné après le déplacement. AvecfullScroll()
, le premier élément de la vue par défilement a été resélectionné à chaque fois dans mon cas, indépendamment de l'élément sélectionné avant que le défilement ne se déplace vers le haut.J'ai eu le même problème et cela l'a résolu. J'espère que cela vous aide.
la source
scrollViewObject.fullScroll(ScrollView.FOCUS_UP)
cela fonctionne bien, mais seul le problème avec cette ligne est que, lorsque les données se remplissent dans scrollViewObject, a été appelée immédiatement. Vous devez attendre quelques millisecondes jusqu'à ce que les données soient remplies. Essayez ce code:OU
la source
Le principal problème de toutes ces solutions valables est que vous essayez de remonter le rouleau lorsqu'il n'est pas encore dessiné à l'écran.
Vous devez attendre que la vue de défilement s'affiche à l'écran, puis la déplacer vers le haut avec l'une de ces solutions. C'est une meilleure solution qu'un post-délai, car cela ne vous dérange pas.
la source
onGlobalLayout
appel de la méthodescrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Très facile
la source
onCreate()
.J'ai rencontré le même problème lorsque j'utilise Scrollview dans View Flipper ou Dialog, ce cas
scrollViewObject.fullScroll(ScrollView.FOCUS_UP)
retourne false de sorte que le casscrollViewObject.smoothScrollTo(0, 0)
est travaillé pour moiFaire défiler le focus vers le haut
la source
la source
la source
Cela a fonctionné pour moi
la source
Ceci est le défilement forcé pour le scrollview :
la source
la source
J'ai résolu mon problème dans Kotlin comme ceci:
la source
la source