2012-10-04 17 views
29

Próbuję wykryć, kiedy widok listy jest przewijany poza pewien ustalony próg w pikselach (w połowie pierwszego elementu). Niestety, getScrollY() wydaje się zawsze zwracać 0 instad pozycji przewijania. Czy istnieje sposób, aby uzyskać rzeczywistą lokalizację przewijania przez piksel?Android ListView bieżące położenie przewijania Y piksele

Oto kod próbowałem używać, ale jak powiedział tylko zwraca 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

Prawidłowe [Rozwiązanie] (http://stackoverflow.com/questions/12727594/android-listview-current-scroll-location- y-pixels/35594825 # 35594825) – Sarasranglt

Odpowiedz

49

Nie ma pojęcia, że ​​Y przewija listę ListView w systemie Android tylko dlatego, że całkowita wysokość zawartości jest nieznana. Widoczna jest tylko wysokość wyświetlanej zawartości.

Jednak jest to możliwe, aby uzyskać aktualną pozycję/Y zwój widocznego elementu, używając następującej Hack: kod

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

Prawdopodobnie masz na myśli to rozwiązanie http://stackoverflow.com/a/3035521/1276636 – Sufian

+0

To naprawdę dobra wskazówka, thx @ Cyril Mottier :) – JakeP

+7

to już nie działa. musisz dodać wysokość wszystkich poprzednich elementów pierwszego widocznego widoku do tego fragmentu kodu. Niektóre wewnętrzne pliki APi zmieniły się ostatnio. Mam nadzieję, że api jest dołączone do prostej funkcji, aby uzyskać tę wartość w pewnym momencie. Wszystkie dostępne rozwiązania są hackowe i z pewnością zerwie się z przyszłymi wersjami API. Nigdy nie należy mieszać z widokami potomnymi widoku listy –

0

Można spróbować realizacji OnTouchListener i zastąpić swoją onTouch(View v, MotionEvent event) i dostać X i Y za pomocą event.getX() i event.getY(). Właśnie stworzyłem demo do przesunięcia w wierszu ListView, które umożliwi przycisk usuwania do usunięcia określonego elementu z ListView. Możesz sprawdzić kod źródłowy z mojego github jako ListItemSwipe.

+4

Nie jest to opcja dla osi Y, ponieważ 'ListView' przewija się w zależności od prędkości' MotionEvent'. –

0

byłaby odpowiedzi Malachiasz jest. Ta funkcja służy do dynamicznej wysokości rzędu.

połączenia onScroll słuchacz funkcja

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

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; 
    } 
Powiązane problemy