RecyclerView
を使用してMultiViewPager
の動作をエミュレートしたい、特に選択したアイテムを画面の中央に配置したい最初と最後の要素を含む。
この画像でわかるように、最初のアイテムは中央に配置されており、これが私の期待される結果になります。
私がしたことは、水平方向のRecyclerView
とLinearLayoutManager
を使用してLinearSnapHelper
を設定することでした。このソリューションの問題は、最初と最後のアイテムが選択範囲として水平方向に中央に配置されないことです。 MultiViewPager
を使用するようにコードを切り替える必要がありますか、それともRecyclerView
を利用して同様の結果を達成することは可能ですか?
getItemOffsets()
の_RecyclerView.ItemDecoration
_を使用してこれを実装し、最初と最後の項目を適切にオフセットできます。
指定されたアイテムのオフセットを取得します。
outRect
の各フィールドは、パディングやマージンと同様に、アイテムビューを挿入するピクセル数を指定します。デフォルトの実装では、outRectの境界が0に設定され、戻ります。追加データのためにアダプタにアクセスする必要がある場合は、
getChildAdapterPosition(View)
を呼び出して、ビューのアダプタ位置を取得できます。
アイテムの測定サイズとRecyclerView
も使用する必要がある場合があります。しかし、これらの情報はとにかく使用することができます。
このソリューションの問題は、最初と最後のアイテムが選択範囲として水平方向に中央に配置されないことです。
これはおそらく、RecycleViewが、そのレイアウト範囲内で、データセット内にあるアイテムの正確な数を表示する責任があるためです。
提供したサンプル画像では、データセットの最初と最後の位置に「プレースホルダー」アイテムを追加することで、その効果を実現できます。このようにして、最初のスロットを占める非表示のアイテムを配置して、中央に配置するアイテムをオフセットすることができます。
このプレースホルダーアイテムは、タッチイベントに応答してはならず、他のアイテムのクリックイベントの処理(具体的には、位置の処理)を妨げてはなりません。
アダプターをgetItemCount
およびおそらくgetItemType
に変更する必要があります。
RecyclerView
にパディングを追加してclipToPadding=false
を追加するだけで、両端のアイテムにのみ影響します。