2012-10-04 73 views
29

我試圖檢測何時列表視圖以像素爲單位滾動超過某個固定閾值(通過第一項的一半)。不幸的是,listview的getScrollY()似乎總是返回滾動位置的0個點。有什麼方法可以按像素獲取實際的滾動位置嗎?Android ListView當前滾動位置Y像素

這裏是我嘗試使用的代碼,但因爲說它只返回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

正確的[溶液](http://stackoverflow.com/questions/12727594/android-listview-current-scroll-location- y-pixels/35594825#35594825) – Sarasranglt

回答

49

Android中沒有Y滾動ListView的概念,只是因爲內容的總高度未知。只有顯示的內容的高度是已知的。

然而,它有可能獲得當前位置/使用下面的技巧可見項Y的滾動:Malachiasz的回答

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

你可能是這個解決方案http://stackoverflow.com/a/3035521/1276636 – Sufian

+0

這是一個非常好的提示,thx @Cyril Mottier :) – JakeP

+7

這不工作了。您必須將第一個可見視圖的所有以前項目的高度添加到該代碼段。最近一些內部api的東西已經改變。我希望這個API能夠包含一個簡單的函數來獲取這個值。所有的解決方案都是駭人聽聞的,並且必將與未來的API版本打破。一個人不應該混淆listview的子視圖 –

0

你可以嘗試實施OnTouchListener並覆蓋其onTouch(View v, MotionEvent event)和使用event.getX()event.getY()得到x和y。我剛剛在ListView行上創建了一個用於滑動的演示,該演示將啓用刪除按鈕以從ListView中刪除特定項目。你可以檢查我的github的源代碼爲ListItemSwipe

+4

這不是y軸的選項,因爲ListView會根據MotionEvent速度進行滾動。 –

0

一個重構代碼。此功能用於動態行高。

呼叫onScroll聽者

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