2012-03-09 81 views
7

有沒有辦法確定listview是否向上或向下滾動?如何檢測列表視圖是在android中向上或向下滾動?

OnScrollListener在這種情況下幫不了我。

在此先感謝!

+0

究竟你想要什麼?你可以解釋更多... – 2012-03-09 06:35:27

+0

我想在列表滾動時製作一些代碼,並在列表向下滾動時製作其他代碼。因此,我想檢測它是否滾動向上或向下 – dor506 2012-03-09 06:40:13

+3

請參閱http://stackoverflow.com/questions/6358428/implementation-of-onscrolllistener-to-detect-the-end-of-scrolling-in-a-listview – 2012-03-09 06:46:46

回答

12

這是一個簡單的實現:

lv.setOnScrollListener(new OnScrollListener() { 
     private int mLastFirstVisibleItem; 

     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 

     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, 
       int visibleItemCount, int totalItemCount) { 

      if(mLastFirstVisibleItem<firstVisibleItem) 
      { 
       Log.i("SCROLLING DOWN","TRUE"); 
      } 
      if(mLastFirstVisibleItem>firstVisibleItem) 
      { 
       Log.i("SCROLLING UP","TRUE"); 
      } 
      mLastFirstVisibleItem=firstVisibleItem; 

     } 
    }); 
+2

只有在頂層物品不再是第一個物品時纔有用。如果您在相同的物品保留在頂部時來回滾動,則不會告訴您方向。 – AndroidDev 2015-05-26 11:56:14

4

ScrollViews中有一種方法報告滾動的移動。它被稱爲onScrollChanged()。但是,它被聲明爲受保護的,因此您必須創建一個包裝類來獲得訪問權限。有關該方法的用法,請查看android文檔。

首先,創建揭露保護法

public interface OnScrollListener { 
void onScrollChanged(int x, int y, int oldx, int oldy); 
} 

然後,創建您的包裝,並延長滾動型

public class ReportingScrollView extends ScrollView { 
private OnScrollListener onScrollListener = null; 

public ReportingScrollView(Context context) { 
    super(context); 
} 

public ReportingScrollView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public ReportingScrollView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public void setOnScrollListener(OnScrollListener onScrollListener) { 
    this.onScrollListener = onScrollListener; 
} 

@Override 
protected void onScrollChanged(int x, int y, int oldx, int oldy) { 
    super.onScrollChanged(x, y, oldx, oldy); 
    if (onScrollListener != null) { 
     onScrollListener.onScrollChanged(x, y, oldx, oldy); 
    } 
} 
} 

最後的接口,包括它像一個自定義視圖您的XML佈局,像平常一樣附加聽衆。

<your.package.ReportingScrollView /> 

scrollingandtrolling.setOnScrollListener(new OnScrollListener() {...}); 
+2

這似乎只是在你拋出列表時才被調用,它不會被重複調用。 – 2013-01-13 05:09:08

0

由一些菜鳥學生給出的解決方案是好的:你必須創建一個包裝使用受保護的onScrollChanged(INT X,INT Y,INT oldx ,int oldy)方法,這會觸發更多的標準AbsListView.OnScrollListener.onScrollStateChanged(AbsListView視圖,int scrollState)。

不幸的是,onScrollChanged()總是返回0作爲參數,無論我如何滾動,並且似乎只在滾動結束時才檢測到,到達列表的頂部或底部。因此我使用下面的代碼來檢測滾動的正確方向:它使用第一個可見項的getTop(),但也使用它的位置來理解第一個項何時不可見;在此項目轉換期間,滾動方向由項目位置本身給出。

 @Override 
     public void onScrollChanged(int x, int y, int oldx, int oldy) { 

      if(listView.getChildAt(0) != null) { 
       int scrollingDir = NO_SCROLLING; 
       int firstChildTop = listView.getChildAt(0).getTop(); 

       if (listView.getFirstVisiblePosition() == mLastFirstVisiblePosition) { 
        if (mLastFirstChildTop < firstChildTop) { 
         //Scrolling DOWN 
         scrollingDir = SCROLLING_DOWN; 
        } else if (mLastFirstChildTop > firstChildTop) { 
         //Scrolling UP 
         scrollingDir = SCROLLING_UP; 
        } 
       } else if(listView.getFirstVisiblePosition() > mLastFirstVisiblePosition) { 
        //Scrolling UP 
        scrollingDir = SCROLLING_UP; 
       } else { 
        //Scrolling DOWN 
        scrollingDir = SCROLLING_DOWN; 
       } 
       mLastFirstVisiblePosition = listView.getFirstVisiblePosition(); 
       mLastFirstChildTop = firstChildTop; 

       switch(scrollingDir) { 
        case SCROLLING_DOWN: 
         //Your DOWN scrolling code here 
         break; 

        case SCROLLING_UP: 
         //Your UP scrolling code here 
         break; 

        default: 
        case NO_SCROLLING: 
         break; 
       } 
      } 
     } 
0
list.setOnScrollListener(new OnScrollListener() { 
     int last_item; 
     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 

     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, 
       int visibleItemCount, int totalItemCount) { 
      if(last_item<firstVisibleItem+visibleItemCount-1){ 
       System.out.println("List is scrolling upwards"); 
      } 
      else if(last_item>firstVisibleItem+visibleItemCount-1){ 
       System.out.println("List is scrolling downwards"); 
      } 
      last_item = firstVisibleItem+visibleItemCount-1; 
     } 
    }); 

這裏基於最後一個可見項目我決定列表是否或進入上下

1

一個簡單和工作方案。

private int lastPosition = -1; 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
     { 
      if(lastPosition == firstVisibleItem) 
      { 
       return; 
      } 

      if(firstVisibleItem > lastPosition) 
      { 
       Logger.print("Going Down"); 
      } 
      else 
      { 
       Logger.print("Going Up"); 
      } 

      lastPosition = firstVisibleItem; 
     } 
+1

完美運作,謝謝! – error1337 2017-07-25 09:45:54

1

對他們來說,永遠仍在尋找科特林一個答案,這適用於它

MainListView.setOnScrollListener(object :AbsListView.OnScrollListener { 
    // var VisibleItem: Int = 0 
     override fun onScroll(p0: AbsListView?, FirstVisibleItem: Int, i2: Int, i3: Int) { 
     /* 
     if(VisibleItem < FirstVisibleItem) 
     { 
     Toast.makeText(applicationContext,"Scrolling Down",Toast.LENGTH_SHORT).show() 
      fab.hide() 
     } 
     if(VisibleItem >FirstVisibleItem) 
     { 
      fab.show() 
      Toast.makeText(applicationContext,"Scrolling Up",Toast.LENGTH_SHORT).show() 
     } 
      VisibleItem=FirstVisibleItem; 
    */ 
     } 
     override fun onScrollStateChanged(p0: AbsListView?, p1: Int) { 
      if (p1 == 1) { 
       fab.hide() 
      } else { 
       fab.show() 
      } 
     } 

    }) 
} 

取消註釋,使用另一種方法。

相關問題