2016-10-30 7 views
7

私は非常に最近、Google Playストアを再生のように素敵な水平RecyclerView多くを持っているために、Support Library v24内部に設けられSnapHelperを使用し始めました。RecyclerView&SnapHelperは - >スナップ/ターゲットに取得ビュー

私の質問は簡単です。スクロール状態がずっとViewPager.OnPageChangedListenerと同じように(セトリングあるとき、私に通知することができます。スクロールがセトリングしたとき、私はデフォルトの動作として中央に表示されますビューをアニメーション化する必要があるため、これは重要ですRecyclerView.OnScrollListenerを使用することにより

そのアニメーションが焦点は今のところすぐに対する中心項目

にもたらされることを示してLinearSnapHelperの。私は、スクロール状態が経由アイドルときに中心にビューを得ることができました次の行:

問題は、スクロールが完了したときにアニメーションを開始するのが奇妙なことです。スクロールがアイドルになるとアニメーションが完了するように、スクロールが収まるようにアニメーションをスムーズに再生する必要があります。

ご覧のとおり、RecyclerViewのどのアイテムが中心になるのか分かりにくいです。


これまで私が試した解決策は次のとおりです。

  1. Iは、スクロール状態がRecyclerView.SCROLL_STATE_SETTLINGに設定されている場合、同じ計算を使用してみました。残念ながら、スクロールがアイドル状態でないときにアダプタからfindVisiblePositionメソッドを呼び出すことは悪い考えです。スクロール速度に応じて、これらのメソッドが呼び出されたときに表示されるアイテムは、スクロールがコンプリート。実際には、コール時に表示されているアイテムを教えてくれます。 onFling(...)が呼び出されたとき、私はをスナップされますビューを取得するためにfindSnapView(...)を使用できますように、それは総理にかなっているが、私はそれを見つけるためにしようとするために必要な...

  2. 私はLinearSnapHelperを拡張を試してみましたかうまくいけば、スクロールが完了したときにどのビューが中央に置かれるかを教えてください。findTargetSnapPosition(...)スクロール状態がRecyclerView.SCROLL_STATE_SETTLINGとき

  3. 私はまた、すべてのこれらのソリューションfindSnapView(...)

を使用するように、試みたが、どれも(異なるスワイプ強度で&スピードをしようとして)複数のテストを渡されていません。いくつかの機会には正しいことがありましたが、さまざまな状況では間違っていたため、ソリューションを使用できなくなってしまいました。

LinearSnapHelper私は、スワイプの後に何とかスクロールした後、スクロールが完了する前に(スクロールする距離の長さ)必要に応じて、したがって、どのビューが最終的なスナップ表示 ...であることを知っていますか?

とにかく、私の主な質問は:スワイプのスピードと強さに関係なく、スワイプ後に私のRecyclerViewのどのアイテムが中央に置かれるのかをどのように知ることができますか?

答えて

1

LinearSnapHelperを使用している場合は、LinearSnapHelper#findTargetSnapPositionメソッドがあります。スナップするViewのAdapter Positionを返します。

0

スクロールが完了したらlayoutManager.findFirstCompletelyVisibleItemPosition()を使用できます。

+0

ありがとうございましたが、私は、アイテムが集中しているかどうかを知る方法を探していました** **スワイプ後は決着していません。 – Mackovich

4

SnapHelperをサブクラス化し、findTargetSnapPositionを上書きする必要があります。 super.findTargetSnapPosition(layoutManager, velocityX, velocityY)によって計算された位置は、あなたのRecyclerViewがスナップする位置です。

SnapHelper snapHelper = new LinearSnapHelper() { 
    @Override 
    public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) { 
     int snapPosition = super.findTargetSnapPosition(layoutManager, velocityX, velocityY); 

     // Do something with snapPosition 

     return snapPosition; 
    } 
}; 
+1

これはほとんど真実ではありません。 'findTargetSnapPosition'をスナップすると-1が返されることがよくあります。 – mradzinski

+0

@mradzinskiあなたの設定について何か変わったことがあるはずです。私は何の問題もなく、このアプローチを非常に長い間使ってきました。 –

関連する問題