Pour une partie de mon application, l'utilisateur se voit présenter une liste de noms et est invité à les regrouper comme il l'entend.
(Remarque : le code du ListView a été copié mot pour mot du tutoriel Android Views. Je ne l'ai pas encore adapté à mes besoins, j'essaie juste de comprendre comment faire fonctionner tout 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 mon ListView en dessous, qui affiche la liste des noms. Tout cela est plus haut que la zone visible de l'écran, ce qui permet à l'utilisateur de faire défiler l'écran verticalement pour tout voir.
Tout cela fonctionne à merveille, sauf que lorsque la page se charge, elle est toujours pré-défilée en haut de mon ListView - au milieu de la page. Le texte et les boutons que j'ai créés pour indiquer à l'utilisateur ce qu'il doit faire ne sont pas visibles.
Je peux saisir l'écran et le faire défiler vers le haut, cela fonctionne très bien, mais j'aimerais que l'écran se charge en ayant déjà été défilé vers le haut. L'utilisateur ne devrait pas avoir à faire défiler l'écran vers le HAUT pour voir le haut d'une page fraîchement chargée. Mais tout ce que j'ai essayé pour faire défiler l'écran jusqu'en haut de façon programmatique 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.
Puisque 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 la ScrollView ou du RelativeLayout qui la contient. Cela semble être confirmé par la propre description de Google de la méthode scrollTo(int x, int y), où il est dit que "Cette version fixe également le défilement aux limites de notre enfant".
Donc, pour rendre une longue question encore plus longue, comment puis-je charger un ensemble de vues à l'écran contenues dans un ScrollView, puis faire défiler le tout de manière programmatique en haut de la page pour que l'utilisateur puisse interagir avec lui ?
Merci !