2012-10-04 14 views
29

Ich versuche zu erkennen, wenn eine Listenansicht über bestimmte feste Schwelle in Pixeln (halb durch das erste Element) gescrollt wird. Leider scheint getScrollY() in Listview immer 0 instad der Scroll-Position zurückzugeben. Gibt es eine Möglichkeit, die tatsächliche Scroll-Position nach Pixel zu erhalten?Android ListView aktuelle Bildlaufposition Y Pixel

Hier ist der Code, den ich versucht, zu verwenden, aber wie gesagt, es gibt nur 0.

getListView().setOnScrollListener(new AbsListView.OnScrollListener() { 
    public void onScroll(AbsListView view, int firstVisibleItem, 
         int visibleItemCount, int totalItemCount) { 
     Log.d("scroll", "scroll: " + getListView().getScrollY()); 
    } 

    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     if (scrollState == 0) 
     Log.d("scroll", "scrolling stopped"); 
    } 
}); 
+0

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

Antwort

49

Es gibt keine Vorstellung von Y scrollen für eine ListView in Android, einfach weil die Gesamthöhe des Inhalts unbekannt ist. Nur die Höhe des angezeigten Inhalts ist bekannt.

Jedoch ist es möglich, die aktuelle Position/Y Spirale eines sichtbaren Elements mit dem folgenden Hack zu bekommen:

getListView().getChildAt(0).getTop(); 
+1

Sie wahrscheinlich diese Lösung meinen http://stackoverflow.com/a/3035521/1276636 – Sufian

+0

Das ist ein wirklich guter Hinweis, thx @ Cyril Mottier :) – JakeP

+7

das funktioniert nicht mehr. Sie müssen die Höhe aller vorherigen Elemente der ersten sichtbaren Ansicht zu diesem Code hinzufügen. Einige interne API-Sachen haben sich in letzter Zeit geändert. Ich hoffe, dass die API eine einfache Funktion enthält, um diesen Wert irgendwann zu erhalten. Alle Lösungen sind hackisch und müssen mit zukünftigen API-Versionen brechen. Man sollte sich niemals mit den Kindansichten einer Listenansicht herumschlagen –

0

Sie versuchen OnTouchListener Implementierung und seine onTouch(View v, MotionEvent event) außer Kraft setzen und die x- und y erhalten event.getX() und event.getY() verwenden. Ich hatte gerade eine Demo für das Wischen in der ListView-Zeile erstellt, die eine Löschschaltfläche zum Löschen eines bestimmten Elements aus der ListView aktivieren würde. Sie können den Quellcode von meinem GitHub als ListItemSwipe überprüfen.

+4

Dies ist keine Option für die y-Achse, da 'ListView' in Abhängigkeit von' MotionEvent' velocity rollt. –

0

Ein Refactoring Code von Malachiasz Antwort. Diese Funktion wird für die Höhe der dynamischen Zeile verwendet.

Anruf OnScroll Zuhörer

mListView.setOnScrollListener(new AbsListView.OnScrollListener() { 
      @Override 
      public void onScrollStateChanged(AbsListView view, int scrollState) { 

      } 

      @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
       if (mCardsListView.getChildCount() > 0) { 
        int scrollY = getScrollY(); 
       } 
      } 
     }); 

getScrollY Funktion

private Dictionary<Integer, Integer> mListViewItemHeights = new Hashtable<Integer, Integer>(); 
private int getScrollY() { 
     View child = mCardsListView.getChildAt(0); //this is the first visible row 
     if (child == null) return 0; 

     int scrollY = -child.getTop(); 

     mListViewItemHeights.put(mCardsListView.getFirstVisiblePosition(), child.getHeight()); 

     for (int i = 0; i < mCardsListView.getFirstVisiblePosition(); ++i) { 
      Integer hei = mListViewItemHeights.get(i); 

      //Manual add hei each row into scrollY 
      if (hei != null) 
       scrollY += hei; 
     } 

     return scrollY; 
    } 
Verwandte Themen