回答
這是一個簡單的實現:
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;
}
});
只有在頂層物品不再是第一個物品時纔有用。如果您在相同的物品保留在頂部時來回滾動,則不會告訴您方向。 – AndroidDev 2015-05-26 11:56:14
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() {...});
這似乎只是在你拋出列表時才被調用,它不會被重複調用。 – 2013-01-13 05:09:08
由一些菜鳥學生給出的解決方案是好的:你必須創建一個包裝使用受保護的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;
}
}
}
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;
}
});
這裏基於最後一個可見項目我決定列表是否或進入上下
一個簡單和工作方案。
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;
}
完美運作,謝謝! – error1337 2017-07-25 09:45:54
對他們來說,永遠仍在尋找科特林一個答案,這適用於它
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()
}
}
})
}
取消註釋,使用另一種方法。
- 1. 如何檢測:向上滾動還是向下滾動?
- 2. 如何檢測ListView向上或向下滾動
- 3. 如何檢查scrollview/recyclerview是向上還是向下滾動android
- 4. 如何檢測滾動視圖在Android中的方向
- 5. Android:在列表視圖中向下滾動時隱藏relativelayout
- 6. StackoverflowException當在Android列表視圖中向下滾動時
- 7. 如何在wp7中滾動查看器/列表框的向上/向下或向左/向右滾動事件
- 8. 如何檢測「向下滾動」事件
- 9. 如何在列表視圖中檢測上滾動
- 10. 測試在Mac OS中滾動是向上還是向下?
- 11. 滾動子視圖左右,但沒有向上或向下
- 12. 檢測列表視圖的滾動方向和距離
- 13. 如何在向上或向下拖動項目的同時滾動列表視圖?
- 14. 檢測用戶向下滾動或在jQuery的滾動
- 15. 移動滾動條向上或向下
- 16. 如何檢測是否雪碧會向上或向下
- 17. 如何在向上滾動時更新列表視圖?
- 18. 如何更新用戶向下滾動的列表視圖?
- 19. 使用上下按鈕向上或向下滾動表格
- 20. WPF列表框 - 檢測滾動條向上/向下按鈕單擊
- 21. 如何在Android中向下滾動EditText
- 22. 過渡向上或向下滾動
- 23. 當我向下滾動頁面或向上滾動頁面時,如何讓圖像向下滾動或向上滾動?
- 24. 如何滾動列表向上和向下的鼠標事件
- 25. 當滾動向下時在列表視圖中獲取座標
- 26. 如何通過向上和向下滾動來觸發Glide在滾動視圖中下載圖像
- 27. 如何知道android中的垂直滾動方向,即向上還是向下
- 28. 如何檢測用戶是否在UIScrollView中向後滾動了一個視圖?
- 29. 在代碼隱藏中向上和向下滾動列表框
- 30. Android - 向下滾動列表查看
究竟你想要什麼?你可以解釋更多... – 2012-03-09 06:35:27
我想在列表滾動時製作一些代碼,並在列表向下滾動時製作其他代碼。因此,我想檢測它是否滾動向上或向下 – dor506 2012-03-09 06:40:13
請參閱http://stackoverflow.com/questions/6358428/implementation-of-onscrolllistener-to-detect-the-end-of-scrolling-in-a-listview – 2012-03-09 06:46:46