2010-01-25 2 views
26

Ich verwende es, aber es gibt immer 0 zurück, obwohl ich bis zum Ende der Liste gescrollt habe.Android: ListView.getScrollY() - Funktioniert es?

+1

Wenn Sie die Anzahl der Pixel suchen, die am Anfang der Liste verschwindet, wenn der Benutzer nach unten scrollt, sehen Sie sich [meine Antwort hier] an (http://stackoverflow.com/questions/10808387/android- getting-genau-scroll-position-in-listview/13415273 # 13415273) – Maria

+0

Die richtige [Lösung] (http://stackoverflow.com/questions/12727594/android-listview-current-scroll-location-y-pixels/35594825 # 35594825) – Sarasranglt

Antwort

31

getScrollY() ist eigentlich eine Methode auf Ansicht, nicht ListView. Es bezieht sich auf den Scroll-Betrag der gesamten Ansicht, so dass es fast immer 0 ist.

Wenn Sie wissen möchten, wie weit der Inhalt der ListView gescrollt wird, können Sie listView.getFirstVisiblePosition();

+0

danke Mann :) das erklärt wirklich viel :) – cV2

+8

Beachten Sie, dass getFirstVisiblePosition das * Element * nicht die * Position * zurückgibt, daher ist es nicht etwas, das Sie als Alternative zu getScrollY verwenden können, außer in dem Umstand, dass alle Listenelemente haben genau die gleiche Höhe. –

+0

Ist es scroolView Position am oberen Ende des Viewports oder am Ende? –

4

Es funktioniert, es gibt den oberen Teil des Bildlaufabschnitts der Ansicht in Pixel vom oberen Rand der sichtbaren Ansicht zurück. Siehe die getScrollY() Dokumentation. Wenn Ihre Liste die volle Ansicht einnimmt, erhalten Sie immer 0, weil der obere Teil der Liste immer oben auf dem Bildschirm angezeigt wird.

Was Sie sehen sich an, wenn Sie am Ende einer Liste sind, ist so etwas wie dieses:

public void onCreate(final Bundle bundle) { 
    super.onCreate(bundle); 
    setContentView(R.layout.main); 
    // The list defined as field elswhere 
    this.view = (ListView) findViewById(R.id.searchResults); 
    this.view.setOnScrollListener(new OnScrollListener() { 
      private int priorFirst = -1; 
      @Override 
      public void onScroll(final AbsListView view, final int first, final int visible, final int total) { 
       // detect if last item is visible 
       if (visible < total && (first + visible == total)) { 
        // see if we have more results 
        if (first != priorFirst) { 
         priorFirst = first; 
         //Do stuff here, last item is displayed, end of list reached 
        } 
       } 
      } 
    }); 
} 

Der Grund für die priorFirst Zähler ist, dass manchmal bewegen können Ereignisse mehrfach erzeugt werden, so Sie müssen nur auf das erste Mal reagieren, wenn das Ende der Liste erreicht ist.

Wenn Sie versuchen, eine automatisch wachsende Liste zu erstellen, würde ich vorschlagen, diese tutorial.

Verwandte Themen