web-dev-qa-db-ja.com

RecyclerViewの最初のアイテムを水平方向に中央揃えにします

RecyclerViewを使用してMultiViewPagerの動作をエミュレートしたい、特に選択したアイテムを画面の中央に配置したい最初と最後の要素を含む

この画像でわかるように、最初のアイテムは中央に配置されており、これが私の期待される結果になります。 Expected result

私がしたことは、水平方向のRecyclerViewLinearLayoutManagerを使用してLinearSnapHelperを設定することでした。このソリューションの問題は、最初と最後のアイテムが選択範囲として水平方向に中央に配置されないことです。 MultiViewPagerを使用するようにコードを切り替える必要がありますか、それともRecyclerViewを利用して同様の結果を達成することは可能ですか?

8
Vektor88

getItemOffsets() の_RecyclerView.ItemDecoration_を使用してこれを実装し、最初と最後の項目を適切にオフセットできます。

指定されたアイテムのオフセットを取得します。 outRectの各フィールドは、パディングやマージンと同様に、アイテムビューを挿入するピクセル数を指定します。デフォルトの実装では、outRectの境界が0に設定され、戻ります。

追加データのためにアダプタにアクセスする必要がある場合は、 getChildAdapterPosition(View) を呼び出して、ビューのアダプタ位置を取得できます。

アイテムの測定サイズとRecyclerViewも使用する必要がある場合があります。しかし、これらの情報はとにかく使用することができます。

8
tynn

このソリューションの問題は、最初と最後のアイテムが選択範囲として水平方向に中央に配置されないことです。

これはおそらく、RecycleViewが、そのレイアウト範囲内で、データセット内にあるアイテムの正確な数を表示する責任があるためです。

提供したサンプル画像では、データセットの最初と最後の位置に「プレースホルダー」アイテムを追加することで、その効果を実現できます。このようにして、最初のスロットを占める非表示のアイテムを配置して、中央に配置するアイテムをオフセットすることができます。

このプレースホルダーアイテムは、タッチイベントに応答してはならず、他のアイテムのクリックイベントの処理(具体的には、位置の処理)を妨げてはなりません。

アダプターをgetItemCountおよびおそらくgetItemTypeに変更する必要があります。

1
CzarMatt

RecyclerViewにパディングを追加してclipToPadding=falseを追加するだけで、両端のアイテムにのみ影響します。

1
I.S