RecyclerView поддерживает положение прокрутки, когда клавиатура отображается / скрывается - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь добиться, когда клавиатура отображается или скрыта, чтобы сохранить вертикальное смещение.Экран должен вести себя как чаты WhatsApp или Discord.Где всякий раз, когда вы открываете клавиатуру, поддерживается вертикальная прокрутка (не позиция элемента, а фактическая прокрутка).

Я пытался сделать следующее:

 recycler_view.addOnScrollListener(object : RecyclerView.OnScrollListener() {
        var state = AtomicInteger(RecyclerView.SCROLL_STATE_IDLE)

        override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
            state.compareAndSet(RecyclerView.SCROLL_STATE_IDLE, newState)
            when (newState) {
                RecyclerView.SCROLL_STATE_IDLE -> {
                    if (!state.compareAndSet(RecyclerView.SCROLL_STATE_SETTLING, newState)) {
                        state.compareAndSet(RecyclerView.SCROLL_STATE_DRAGGING, newState)
                    }
                }
                RecyclerView.SCROLL_STATE_DRAGGING -> {
                    state.compareAndSet(RecyclerView.SCROLL_STATE_IDLE, newState)
                }
                RecyclerView.SCROLL_STATE_SETTLING -> {
                    state.compareAndSet(RecyclerView.SCROLL_STATE_DRAGGING, newState)
                }
            }
        }

        override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
            if (state.get() != RecyclerView.SCROLL_STATE_IDLE) {
                verticalScrollOffset.set((recycler_view).computeVerticalScrollOffset())
            }
        }

И затем:

recycler_view.addOnLayoutChangeListener { _, _, _, _, bottom, _, _, _, oldBottom ->
        if (oldBottom != bottom) {
            recycler_view.post {

                recycler_view.scrollTo(verticalScrollOffset.get())
            }
        }
    }

Однако это вызывает исключение:

RecyclerView does not support scrolling to an absolute position. Use scrollToPosition instead

Я также попытался использовать scrollToPositionWithOffset (0, verticalScrollOffset.get ()), который также не работал.

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

...