Как программно привязаться к позиции в представлении Recycler с LinearSnapHelper

Я реализовал горизонтальный recyclerView с LinearSnapHelper, чтобы реализовать ввод пользовательского интерфейса, который выбирает конкретную конфигурацию. Вроде как старый школьный сборщик / селектор или прядильщик. Элемент в центре - это выбранная позиция.

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

.scrollToPosition() не будет работать, потому что он помещает выбранный элемент в начале.

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

Мне нужно что-то вроде LinearSnapHelper.snapToPosition()

4 ответа

Более общее решение:

  1. Сначала прокрутите RecyclerView, чтобы сделать целевой элемент видимым.
  2. Затем возьмите объект целевого вида и используйте SnapHelper, чтобы определить расстояние для окончательной привязки.
  3. Наконец, прокрутите до целевой позиции.

Фрагмент кода:

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);

Это не самый красивый способ, но, похоже, работает!

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