Вы можете легко сделать это с помощью Recyclerview SnapHelper .
val snapHelper = LinearSnapHelper()
snapHelper.attachToRecyclerView(rv_items)
Взгляните на эту статью для получения привязанного вида, особенно этого бита :
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
if (behavior == Behavior.NOTIFY_ON_SCROLL) {
maybeNotifySnapPositionChange(recyclerView)
}
}
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
if (behavior == Behavior.NOTIFY_ON_SCROLL_STATE_IDLE
&& newState == RecyclerView.SCROLL_STATE_IDLE) {
maybeNotifySnapPositionChange(recyclerView)
}
}
private fun maybeNotifySnapPositionChange(recyclerView: RecyclerView) {
val snapPosition = snapHelper.getSnapPosition(recyclerView)
val snapPositionChanged = this.snapPosition != snapPosition
if (snapPositionChanged) {
onSnapPositionChangeListener?.onSnapPositionChange(snapPosition)
this.snapPosition = snapPosition
}
}
Несмотря на то, что код находится в Kotlin, методы те же, и вы можете понять, как это реализовать.
Другое решение, если его нет слишком много данных, используется NumberPicker :
private fun showPicker() {
val d: AlertDialog.Builder = AlertDialog.Builder(requireContext())
val inflater = this.layoutInflater
val dialogView: View = inflater.inflate(R.layout.my_picker, null)
val numberPicker =
dialogView.findViewById<View>(R.id.numberPicker) as NumberPicker
numberPicker.maxValue = 50
numberPicker.minValue = 1
numberPicker.wrapSelectorWheel = false
d.setTitle("Set duration")
.setView(dialogView)
.setPositiveButton(
"Done"
) { _, _ ->
duration = numberPicker.value
}
.setNegativeButton(R.string.general_cancel) { dialog, _ ->
dialog.cancel()
}
.create().show()
}