Как создать прокручиваемый текстовый вид, который привязывается к положению - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь создать функцию, аналогичную функции Headspace, где у них есть прокручиваемое текстовое представление, которое фиксируется в позиции (затем возвращает значение). в Java / Android?

Было бы ли это использовать ViewPager2 (но это кажется довольно сложным для чего-то столь простого) или использовать RecyclerView (но тогда у вас есть сложность интеграции привязки к позициям и возврата value)?

Я чувствую, что должен быть простой и эффективный способ сделать это, которого мне не хватает.

Выбор времени свободного пространства

1 Ответ

1 голос
/ 14 июля 2020

Вы можете легко сделать это с помощью 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()
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...