Как программно привязаться к позиции в представлении Recycler с LinearSnapHelper
Я реализовал горизонтальный recyclerView с LinearSnapHelper, чтобы реализовать ввод пользовательского интерфейса, который выбирает конкретную конфигурацию. Вроде как старый школьный сборщик / селектор или прядильщик. Элемент в центре - это выбранная позиция.
работает нормально и все, но вот проблема. При первоначальном запуске мне нужно программно установить позицию представления рециркулятора так, чтобы выбранный элемент (индекс которого был загружен с диска) находился в центре.
.scrollToPosition()
не будет работать, потому что он помещает выбранный элемент в начале.
теперь я знаю, что могу сделать всю математику, вычислить координату x и установить ее вручную, но это большая избыточная работа, потому что LinearSnapHelper уже делает это, и я чувствую, что должен быть способ просто использовать эту логику, но с на самом деле инициирование броска.
Мне нужно что-то вроде LinearSnapHelper.snapToPosition()
4 ответа
Более общее решение:
- Сначала прокрутите RecyclerView, чтобы сделать целевой элемент видимым.
- Затем возьмите объект целевого вида и используйте SnapHelper, чтобы определить расстояние для окончательной привязки.
- Наконец, прокрутите до целевой позиции.
Фрагмент кода:
mLayoutManager.scrollToPosition(selectedPosition);
post(new Runnable() {
@Override
public void run() {
View view = mLayoutManager.findViewByPosition(selectedPosition);
if (view == null) {
Log.e(WingPickerView.class.getSimpleName(), "Cant find target View for initial Snap");
return;
}
int[] snapDistance = mSnapHelper.calculateDistanceToFinalSnap(mLayoutManager, view);
if (snapDistance[0] != 0 || snapDistance[1] != 0) {
mRecyclerView.smoothScrollBy(snapDistance[0], snapDistance[1]);
}
}
});
Попробуйте вызвать smoothScrollToPosition для объекта RecyclerView и передать индекс позиции (int)
mRecyclerView.smoothScrollToPosition(position);
Работал для меня с LinearLayoutManager и LinearSnapHelper. Он оживляет начальную прокрутку, но, по крайней мере, фиксирует элемент на месте.
Это мой первый пост в стеке, надеюсь, это поможет:)
greetRecycler.scrollToPosition(targetPosition)
greetRecycler.post {
val view = layoutManager.findViewByPosition(targetPosition)
if (view == null) {
Log.e("SANJAY", "Cant find target View for initial Snap")
return@post
}
val snapDistance = snapHelper.calculateDistanceToFinalSnap(layoutManager, view)
snapDistance?.let {
if (it[0] != 0 || it[1] != 0) {
greetRecycler.scrollBy(it[0], it[1])
}
}
}
У меня есть recyclerView
который я добавил padding
на left
а также right
с фиктивными взглядами в адаптере. Так что первый "фактический" элемент может быть привязан к.
Я не мог получить smoothScrollToPosition(0)
работать хотя для начальной оснастки. Я использовал следующее
recycler.scrollBy(snapHelper.calculateDistanceToFinalSnap(binding.recycler.getLayoutManager(), recycler.getChildAt(1))[0], 0);
Это не самый красивый способ, но, похоже, работает!