Wie scrolle ich zum Anfang des langen ScrollView-Layouts?

162

Für einen Teil meiner App wird dem Benutzer eine Liste mit Namen angezeigt und er wird gebeten, diese nach Belieben zu gruppieren.

(Beachten Sie, dass der ListView-Code wörtlich aus dem Android Views-Lernprogramm kopiert wurde. Ich habe ihn noch nicht an meine Bedürfnisse angepasst. Ich versuche nur herauszufinden, wie dies funktioniert.)

Das Grundlayout ist ein LinearLayout, das eine ScrollView (im folgenden Code "groupsScrollView" genannt) enthält und ein RelativeLayout enthält. Ich habe einige Schaltflächen und Text und dann meine ListView darunter, die die Liste der Namen anzeigt. All dies ist größer als der sichtbare Bildschirmbereich, sodass der Benutzer vertikal scrollen kann, um alles zu sehen.

Dies alles funktioniert wunderbar, außer wenn die Seite geladen wird, wird sie immer zum Anfang meiner ListView vorgescrollt - in der Mitte der Seite. Der von mir erstellte Text und die Schaltflächen, die dem Benutzer mitteilen, was zu tun ist, sind nicht sichtbar.

Ich kann den Bildschirm greifen und nach oben scrollen, das funktioniert einwandfrei, aber ich möchte, dass der Bildschirm geladen wird, nachdem er bereits nach oben gescrollt wurde. Der Benutzer sollte nicht nach OBEN scrollen müssen, um den oberen Rand einer frisch geladenen Seite zu sehen. Aber alles, was ich versucht habe, programmgesteuert zum oberen Bildschirmrand zu scrollen, ist fehlgeschlagen.

Hier ist meine onCreate-Methode:

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();
        }
      });
}

Die Zeile "mainScrollView.pageScroll (View.FOCUS_UP)" ist das Problem. Sie verursacht keinen Fehler, scheint aber nichts zu tun. Ich habe scrollTo (0,0), scrollDirection (View.FOCUS_UP) ausprobiert ) und alles andere, was mir einfällt.

Da ich keine Fehlermeldung erhalte, muss ich davon ausgehen, dass diese Bildlaufbefehle tatsächlich funktionieren, aber zum Anfang der ListView und nicht zum Anfang der ScrollView oder des RelativeLayout, in dem sie enthalten sind. Dies scheint durch Googles eigene Beschreibung der scrollTo-Methode (int x, int y) bestätigt zu werden, in der steht: "Diese Version klemmt auch das Scrollen an die Grenzen unseres Kindes."

Um eine lange Frage noch länger zu stellen, wie lade ich eine Reihe von Ansichten auf den Bildschirm, die in einer ScrollView enthalten sind, und scrolle dann programmgesteuert das Ganze zum oberen Rand der Seite, damit der Benutzer damit interagieren kann?

Vielen Dank!

Glenn
quelle

Antworten:

264

Versuchen

mainScrollView.fullScroll(ScrollView.FOCUS_UP);

es sollte funktionieren.

roomtek
quelle
Funktioniert auch bei mir. : D
Muntasir Aonik
1
Ich habe festgestellt, dass ScrollView # fullScroll () den aktuellen Fokus ändert. Ich habe mit EditText getestet.
IllusionJJ