2017-12-16 1 views
7

デフォルトのRecyclerViewファーストスクロールを使用しており、それをサポートするためにthis guideに従っています。RecyclerView高速スクロール親指の高さが大きいデータセットでは小さすぎます

ここで問題は、親指がデータセットのサイズに従って高さのサイズを変更することです。 100以上の大きなアイテムの場合、親指は非常に小さくなり、ドラッグに反応することがほとんどできなくなります。

高速スクロールサムの最小高さを設定する方法はありますか。

+2

私のアプリにも同じ問題があります。リストサイズに応じて小さくなっていない修正サムを定義できますか? – egmontr

+1

私のアプリケーションに同じ問題があります –

+0

上記の答えは非常に限られています。あなたがしたいことの[例](https://bitbucket.org/StylingAndroid/scrollingrecyclerview/src/2fc7d871b911144b492744bb3a5097bb01869ac1?at=Part1)です。 –

答えて

3

これは部分的な回答に過ぎません。私はパズルの1ピースを(少なくとも)欠いているが、うまくいけば誰かがそれを理解することができる。 、スクロールバーのつまみのサイズ/位置がLinearLayoutManager内の三つの方法によって制御される(OPの質問にリンクの回答で述べたように)あなたが<RecyclerView>タグに必要な属性を追加したら

  • int computeVerticalScrollRange():スクロールバーのトラックのサイズ。

  • int computeVerticalScrollExtent():スクロールバーの親指のサイズ。

  • int computeVerticalScrollOffset():スクロールバーのトラックの上端からスクロールバーの親の上端までの距離。

これらの方法の単位は任意です。 3つのメソッドがすべて同じユニットを共有している限り、好きなものを使用できます。

  • mSmoothScrollbarEnabled == true:デフォルトにより、LinearLayoutManagerは単位の二組のいずれかを使用するRecyclerViewに見えるアイテムのピクセルサイズに基づいて、ユニットを使用します。

  • mSmoothScrollbarEnabled == falseRecyclerViewのアダプタで表示されるアイテムの位置に基づいてユニットを使用してください。

スクロールバーの親指の大きさに自分自身を制御するには、あなたがこれらのメソッドをオーバーライドする必要があります...しかし、ここで私は欠けている作品です。私の実験の全てにおいてを、computeVerticalScrollExtent()がで呼び出されることはありませんがシステム。それでも、ここではまだいくつかの進歩を示すことができます。

まず、アイテムの位置が内側にある500 CardViewを示す簡単なアダプタを作成しました。私はいくつかの本当にシンプルな(しかし醜い)ドロワブルで速いスクロールを可能にしました。ここでは、スクロールバーは単にデフォルトLinearLayoutManager実装で次のようになります。

enter image description here

あなたは500(小)の項目で、見つけてきたように、スクロールバーのつまみは本当に小さいと上をタップするのは非常に困難です。 computeVerticalScrollRange()をオーバーライドすることで、スクロールバーを大幅に大きくすることができます...私は大きな変化を示すためにランダムに本質的5000を選んだ:あなたが期待するようになりましスクロールバーが動作しません、もちろん

enter image description here

を。通常のように親指を動かすことでリストをスクロールし、親指をドラッグしてリストをすばやくスクロールすることで、リストの移動がはるかに少なくなります。 「

@Override 
public int computeVerticalScrollRange(RecyclerView.State state) { 
    return 5000; 
} 

@Override 
public int computeVerticalScrollOffset(RecyclerView.State state) { 
    return (int) (super.computeVerticalScrollOffset(state)/23.5f); 
} 

しかし、これはまだdoesnの次のようcomputeVerticalScrollOffset()をオーバーライド5000のランダムに選択された範囲で自分のデバイスで

は、私はそれをドラッグして、リストをスクロールすると、スクロールバーのつまみが完全に移動します2番目の問題を修正しました。親指でドラッグするだけでリストが正しくスクロールされません。上で述べたように、 computeVerticalScrollExtent()をオーバーライドするのが適切なように思えますが、システムはこのメソッドを呼び出すことはありません。私はそれを単にオーバーライドして例外をスローし、私のアプリは決してクラッシュしません。

これは少なくとも、完全な解決策を求める正しい方向に人々を導くのに役立ちます。

PS:この回答に含まれているcomputeVerticalScrollRange()computeVerticalScrollOffset()の実装は意図的に単純です(偽の読まれた)。 「本当の」実装ははるかに複雑です。デフォルトのLinearLayoutManager実装では、デバイスの向き、リスト内の最初と最後の目に見える項目、両方向のオフスクリーン項目の数、滑らかなスクロール、さまざまなレイアウトフラグなどが考慮されます。

関連する問題