2012-03-09 4 views
7

listview가 위 또는 아래로 스크롤되는지 확인하는 방법이 있습니까?목록보기가 안드로이드에서 위 또는 아래로 스크롤하는 것을 감지하는 방법은 무엇입니까?

OnScrollListener는이 경우에 도움이되지 않습니다.

미리 감사드립니다.

+0

정확히 무엇을 원하니? uplz 더 설명 할 수 있습니다 ... –

+0

목록이 스크롤 될 때 일부 코드를 만들고 목록이 아래로 스크롤 될 때 다른 코드를 만들고 싶습니다. 따라서 위 또는 아래로 스크롤하면 감지하고 싶습니다. – dor506

+3

참조 http://stackoverflow.com/questions/6358428/implementation-of-onscrolllistener-to-detect-the-end-of-scrolling-in-a-listview –

답변

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

4

ScrollViews에는 스크롤 이동을보고하는 방법이 있습니다. onScrollChanged()이라고합니다. 그러나 protected로 선언되므로 액세스 할 수 있도록 래퍼 클래스를 만들어야합니다. 이 방법을 사용하려면 안드로이드 문서를 확인하십시오.

첫째,

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

마지막으로있는 ScrollView를, 그리고 보호 방법

public interface OnScrollListener { 
void onScrollChanged(int x, int y, int oldx, int oldy); 
} 
노출 래퍼를 작성하고 확장 할 수있는 인터페이스를 생성, 사용자 지정보기처럼 XML 레이아웃에 포함하고, 평소와 같이 청취자를 첨부하십시오.

<your.package.ReportingScrollView /> 

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

이것은 목록에서 벗어날 때만 호출되는 것으로, 반복적으로 호출되지는 않습니다. –

0

일부 멍청한 놈 학생에 의해 주어진 솔루션은 좋다 : 당신이 보호 onScrollChanged (INT의 X, INT의 Y를, INT oldx 사용하는 랩퍼를 작성해야 , int oldy) 메소드를 호출합니다.이 메소드는 표준 AbsListView.OnScrollListener.onScrollStateChanged (AbsListView view, int scrollState)보다 자주 트리거됩니다.

불행히도 onScrollChanged()는 스크롤하는 방법과 상관없이 항상 매개 변수로 0을 반환하고 스크롤이 끝나면 목록의 상단이나 하단에 도달 할 때만 감지하는 것처럼 보입니다.

스크롤의 올바른 방향을 감지하기 위해 다음 코드를 사용했습니다. 첫 번째 항목의 getTop()을 사용하지만 첫 번째 항목이 더 이상 보이지 않을 때 위치를 사용합니다. 이 항목 전이 중에 스크롤 방향은 항목 위치 자체에 의해 부여됩니다. 목록이 아래로

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

. 누구를 위해 지금까지 여전히 코 틀린에 대한 답을 찾고

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

쉽고 작업 솔루션을 가거나 여부를 내가 결정 마지막으로 볼 수있는 항목에 따라 다음

 @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; 
       } 
      } 
     } 
+1

완벽하게 작동했습니다. 감사합니다. – error1337

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() 
      } 
     } 

    }) 
} 

의 주석이 다른 방법을 사용하는 경우,이 작동합니다.

관련 문제