Не пытайтесь работать с RecyclerView в CoordinatorLayout при прокрутке

Я столкнулся с необычным поведением с RecyclerView как вторым потомком CoordinatorLayout, сразу после AppBarLayout (как описано во многих примерах).

Моя проблема заключается в том, когда я просматриваю представление recycler, и я хочу щелкнуть по определенному элементу. Иногда мне нужно нажать 2 раза, чтобы выбрать этот элемент, он, похоже, связан с поведением. Например, если я прокручиваю нижнюю часть списка ресайклеров, тогда, если я отброшу палец от нижней части экрана до вершины (чтобы увидеть больше данных, но в моем случае я не вижу больше данных, так как я я уже на дно), а затем быстро нажимаю на элемент, он, кажется, останавливает бросок, а второй клик фактически выбирает элемент... Такое поведение явно не происходит при использовании простого вида ресайклинга без CoordinatorLayout.

Мой recyclerview просто держит простой список String и использует следующее поведение макета: @string/appbar_scrolling_view_behavior

Вы знаете, почему?

[EDIT] Я только что попробовал с прокруткой Android Studio образец, и похоже, что это ошибка из репозитория поддержки Google. Фактически, при использовании версии поддержки 26.1.O (то же самое с 26.0.0 и 26.0.2), ошибка, о которой я говорю, присутствует, но если вы попробуете с версией 26.0.0-alpha1 или 26.0.0-beta1, он фактически работает...

В Google есть две открытые ошибки: https://issuetracker.google.com/u/1/issues/66996774 https://issuetracker.google.com/u/1/issues/68077101

Пожалуйста, отметьте эти ошибки, если вы столкнулись с одной и той же проблемой

Ответ 2

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

В принципе идея имитирует щелчок по вложенномуScrollView.

В моем случае после того, как я обнаружил, что "AppBarLayout" полностью расширен, я посылаю кран к вложенному.

protected void onCreate(final Bundle savedInstanceState) {

    getAppBarLayout().addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {

      @Override
      public void onOffsetChanged(final AppBarLayout appBarLayout, final int verticalOffset) {

          if (verticalOffset == 0) { 
              // State.EXPANDED
              simulatedClick(nestedScroll)
          } else if (Math.abs(verticalOffset) >= appBarLayout.getTotalScrollRange()) { 
              // State.COLLAPSED
          } else { 
              // State.IDLE
          }
      }
  });
}

private void simulatedClick(@NonNull final View view) {
    // Obtain MotionEvent object
    final long downTime = SystemClock.uptimeMillis();
    final long eventTime = SystemClock.uptimeMillis() + 100;
    final MotionEvent motionEvent = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, 0.0f, 0.0f, 0);
    // Dispatch touch event to view
    view.dispatchTouchEvent(motionEvent);
}

ПРИМЕЧАНИЕ. Я действительно не рекомендую использовать такие хаки, это непрофессионально и не поддаётся контролю, но чем больше вы знаете...

Ответ 3

если с помощью RecyclerView в NestedScrollView добавьте эту строку в RecyclerView:

android:nestedScrollingEnabled="false"

Я надеюсь, что это поможет вам.