Скроллинг в RecyclerView работает только в одну сторону
У меня есть RecyclerView:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/chartRecyclerView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:overScrollMode="never"
app:layout_constraintTop_toTopOf="@+id/line1"
app:layout_constraintBottom_toBottomOf="@+id/bottomLine"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
c LinearLayoutManager-ом:
chartRecyclerView.run {
layoutManager = LinearLayoutManager(
binding.сhartRecyclerView.context,
RecyclerView.HORIZONTAL,
false
)
adapter = ChartAdapter(this@Chart)
}
И я отображаю 5 элементов RecyclerView на экране и хочу, чтобы при нажатии на элемент он центрировался. Для этого использую следующий код:
override fun onChartColumnClicked(item: SurveyChartColumnData) {
val items = adapterItems.value ?: return
val newPosition = items.indexOf(item)
Logger.info("newPosition: $newPosition")
if (newPosition in items.indices) {
val oldSelectedItemPosition = items.indexOfFirst { it.isSelected }
val oldSelectedItem = items.first { it.isSelected }
if (oldSelectedItemPosition == newPosition) {
return
}
oldSelectedItem.isSelected = false
item.isSelected = true
when {
newPosition < CENTRAL_POSITION -> {
Logger.info("scrollToPosition: 0")
binding.сhartRecyclerView.scrollToPosition(0)
}
else -> {
Logger.info("scrollToPosition: ${newPosition - 2}")
binding.сhartRecyclerView.scrollToPosition(newPosition - 2)
}
}
}
}
Проблема в том, что скроллинг работает, только если новый выбранный элемент имеет позицию в адаптере меньше старого выбранного элемента (т.е. сколлинг работает только в левую сторону). В чём может быть причина этих проблем и как их можно решить?
UPD: При этом если заменить
binding.сhartRecyclerView.scrollToPosition(newPosition - 2)
на
(binding.сhartRecyclerView.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(newPosition - 2, 0)
то всё работает отлично! Но в чём причина этого, я так и не понимаю...