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 не работала. Вам просто нужно добавить представление о нем, а затем сделать его исчезнувшим.