scrollToPositionWithOffset из LinearLayoutManager в RecyclerView не работает

Я пытаюсь сделать горизонтальный список липких изображений с RecyclerView и я хотел бы переместить их на смещение пикселей с scrollToPositionWithOffset, Я думал прохождение 0 как position и пиксели, которые я хочу переместить вправо / влево, как offset,

Но это не работает, список остается нетронутым, не прокручивается, он не перемещается. Это моя реализация:

final LargeImageAdapter mLargeImageAdapter = new LargeImageAdapter(this);
linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(mLargeImageAdapter);

seekBar = (SeekBar)findViewById(R.id.seekBar);
seekBar.setMax(7000);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        int scrollToDX = progress;

        ((LinearLayoutManager)recyclerView.getLayoutManager()).scrollToPositionWithOffset(0, scrollToDX);
        // tried invoking also linearLayoutManager instead getLayoutManager.
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
});

Что я делаю неправильно?

Большое спасибо.

С уважением.

Рафаэль.

5 ответов

Решение

Я наконец использовал:

recyclerView.scrollBy(int offsetX, int offsetY); установка offsetY = 0 и это работает сейчас.

Я не понимаю, в чем полезность функции scrollToPositionWithOffset,

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

Поздний ответ на ваш первый вопрос и дополнение к вашему ответу:

Ваш метод работает лучше для ваших личных потребностей, потому что scrollToPositionWithOffset не предназначен, чтобы делать то, что вы хотите.

Как сказано в документе здесь:

[...] Разрешенный запуск макета зависит от [...] getLayoutDirection(android.view.View) [...]

Это означает, что в вашем случае это сместит целевую позицию прокрутки в направлении макета, по вертикали.

Я не понимаю, что полезности функции scrollToPositionWithOffset.

он позволяет не только прокручивать данный элемент в списке, но и размещать его в более "видимом" или иным удобном месте.

недавно я тоже столкнулся с этой проблемой, я вызываю scrollToPositionWithOffset , когда onScrolled()напрямую, но ничего не меняется, при этом я обращаюсь к scrollToPosition(), даже к scrollBy(), но не помогает, наконец, я пытаюсь отложить это, чтобы оно сработало, в первый раз я задержал 50 мс, но две недели спустя я обнаружил, что этого недостаточно, поэтому я увеличить до 100 мс без подходов в моих руках, конечно, это работает, просто чувствую себя немного неуверенно.

      val layoutManager = LinearLayoutManager(hostActivity, VERTICAL, false)
fileRv.layoutManager = layoutManager
fileRv.addOnScrollListener(object : RecyclerView.OnScrollListener() {
    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        if (dx == 0 && dy == 0) {
            scrollToLastPosition()
        }
    }

    private fun scrollToLastPosition() {
        val lastScrollPosition = viewModel.consumeLastScrollPosition()
        if (lastScrollPosition > 0) {
            Handler().postDelayed({ layoutManager.scrollToPositionWithOffset(lastScrollPosition, 0) }, 100)
        }
    }
})

override fun onItemClick(position: Int) {
    layoutManager.findFirstVisibleItemPosition().let {
        if (it >= 0) viewModel.markLastScrollPosition(it)
    }
}

fun markLastScrollPosition(position: Int) {
    currentFolderListData.value?.lastOrNull()?.lastScrollPosition = position
}

fun consumeLastScrollPosition(): Int {
    currentFolderListData.value?.lastOrNull()?.run {
        return lastScrollPosition.apply { lastScrollPosition = -1 }
    }
    return 0
}

Я нахожу решение. Потому что я разработчик DNA Launcher. Когда я использую RecyclerView для отображения списка приложений AZ, я обнаружил, что функция scrollToPositionWithOffset не работает. Отслеживаю проблему почти сутки и разобрался.

Когда RecyclerView снова отобразится, просто позвольте родителю RecyclerView выполнить requestLayout.

Меня устраивает.

И я знаю, как сделать так, чтобы функция scrollToPositionWithOffset не работала. Вам просто нужно добавить представление о нем, а затем сделать его исчезнувшим.

Другие вопросы по тегам