2015-10-31 7 views
19

recyclerviewでスクロールの開始/終了と方向を検出する必要があります。スクロールリスナーには、onScrolled()onScrollStateChanged()という2つのメソッドがあります。最初のメソッドは、スクロールが開始された後に呼び出されます(実際にはonScrolled()と呼ばれ、onScrolling()ではありません)。 2番目の方法は状態に関する情報を示しますが、方向情報はありません。目標を達成するにはどうすればいいですか?recyclerviewの開始スクロールと終了スクロールの検出

答えて

34

ステップ1あなたはRecyclerView.OnScrollListenerを拡張するクラスを作成し、これらのメソッドをオーバーライドすることができ

public class CustomScrollListener extends RecyclerView.OnScrollListener { 
    public CustomScrollListener() { 
    } 

    public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
     switch (newState) { 
      case RecyclerView.SCROLL_STATE_IDLE: 
       System.out.println("The RecyclerView is not scrolling"); 
       break; 
      case RecyclerView.SCROLL_STATE_DRAGGING: 
       System.out.println("Scrolling now"); 
       break; 
      case RecyclerView.SCROLL_STATE_SETTLING: 
       System.out.println("Scroll Settling"); 
       break; 

     } 

    } 

    public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
     if (dx > 0) { 
      System.out.println("Scrolled Right"); 
     } else if (dx < 0) { 
      System.out.println("Scrolled Left"); 
     } else { 
      System.out.println("No Horizontal Scrolled"); 
     } 

     if (dy > 0) { 
      System.out.println("Scrolled Downwards"); 
     } else if (dy < 0) { 
      System.out.println("Scrolled Upwards"); 
     } else { 
      System.out.println("No Vertical Scrolled"); 
     } 
    } 
} 

ステップ2 - setOnScrollListenerはaddOnScrollListener

mRecyclerView.addOnScrollListener(new CustomScrollListener()); 
+0

プラスワン........魅力などのように作業します。おかげ –

+1

は 'RecyclerView.OnScrollListener'はそれを決めたグーグルDEV @インタフェース/手のひらを顔に当てるではありません。 –

26

onScrollStateChanged(int state)のマニュアルを参照してください。 三つの可能な値は次のとおりです。

  • SCROLL_STATE_IDLE:いいえスクロールは行われません。
  • SCROLL_STATE_DRAGGING
  • :ユーザーが画面上で指をドラッグしている(または、それはプログラム的に行われている
  • SCROLL_STATE_SETTLING:。ユーザーが自分の指を上げており、アニメーションは現在、鈍化しているので

ます場合。そして、あなたはこのようなものを作成することができ、スクロールが開始および終了したときに検出します:

public void onScrollStateChanged(int state) { 
    boolean hasStarted = state == SCROLL_STATE_DRAGGING; 
    boolean hasEnded = state == SCROLL_STATE_IDLE; 
} 
+1

OKをスクロールrecyclerViewに関連する私の例外OutOfBoundsを修正しましたが、どのようにしても方向を検出することができます同じ時間ですか? – greywolf82

+3

あなたは 'onScrolled(int型DX、int型DY)をオーバーライド'と 'dy'はあなたに1つまたは他の方向を与える、正または負であるかどうかを確認することができます。 –

2

を使用することをお勧めします推奨されませんので、それを行うための最も簡単な方法は、あなたのlayoutManagerを引き出すことです。たとえば、

private RecyclerView.OnScrollListener mListener = new RecyclerView.OnScrollListener() { 
    @Override 
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
     super.onScrollStateChanged(recyclerView, newState); 

     GridLayoutManager layoutManager=GridLayoutManager.class.cast(recyclerView.getLayoutManager()); 
     int visibleItemCount = layoutManager.getChildCount(); 
     int totalItemCount = layoutManager.getItemCount(); 
     int pastVisibleItems = layoutManager.findFirstCompletelyVisibleItemPosition(); 

     if(pastVisibleItems+visibleItemCount >= totalItemCount){ 
      // End of the list is here. 
      Log.i(TAG, "End of list"); 
     } 
    } 
} 

希望します。ここ

0

スクロールが(RecyclerViewのために)停止した後のアクションを作るために完全なソリューションです

recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { 
        @Override 
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
         //Your action here 
        } 
       }); 
関連する問題