https://gist.github.com/chrisbanes/8391b5adb9ee42180893300850ed02f2

ько что обновил до API 26 и поддержки библиотеки 26.0.2. Но я обнаружил, что мойRecyclerView элементы не кликабельны сразу после прокрутки. Если вы подождите секунду, это будет работать. Но если вы щелкнете по элементу немедленно, он не будет. Даже еслиRecyclerView не прокручивается вообще (например, прокручивается до самого верха).

Когда я перешел на поддержку библиотеки 25.4.0, все снова пошло хорошо. Ключевым моментом является то, что мойRecyclerView находится вCoordinatorLayout и имеетSCROLL_FLAG_SCROLL флаг на моемToolbar изAppBarLayout, Если я не использую этот флаг, то эта проблема исчезнет. Так что я думаю, что это скрытое изменение поведения библиотеки поддержки 26.

Я пытался добавитьfocusable="false" кCoordinatorLayout но все равно не повезло.

Есть ли способ отключить это поведение? Потому что действительно раздражает дважды щелкнуть, чтобы вызвать событие щелчка.

 <android.support.design.widget.CoordinatorLayout
        android:id="@+id/coordinateLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
            android:id="@+id/fragmentAppBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:elevation="0dp"
            android:background="@null">
        <include
                android:id="@+id/dynamicActionBarHolder"
                layout="@layout/dynamic_action_bar"/>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/pullToRefreshMailRecycler"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.v7.widget.RecyclerView
                android:id="@+id/mailRecyclerView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>

    </android.support.v4.widget.SwipeRefreshLayout>

</android.support.design.widget.CoordinatorLayout>

РЕДАКТИРОВАТЬ

Я думаю, что проблема заключается вscrollState изRecyclerView, Когда он остановлен, он не изменяется наSCROLL_STATE_IDLE немедленно. Глядя в исходный кодRecyclerViewЯ нашел тамViewFlinger управление состоянием прокрутки. Когда я бегу вниз, чтобы прокрутить вверх, это не звонитsetScrollState(SCROLL_STATE_IDLE) вместо этого он ждет некоторое время, чтобы запустить этот метод. Чем быстрее я кидаюсь, тем больше времени мне нужно ждать. Это так же, как RecyclerView все еще прокручивается в фоновом режиме. Посколькуscroller.isFinished() не возвращает истину сразу послеRecyclerView прекратить прокрутку, когда он коснулся вершины. Может быть, это ошибкаRecyclerView когда это вCoordinatorLayout.

 Aytek Sökmen27 сент. 2017 г., 18:07
Вы можете удалитьapp:layout_behavior вSwipeRefreshLayout и попробуй еще раз ?
 Kimi Chiu27 сент. 2017 г., 18:19
Это все еще не кликабельно после прокрутки. Единственный способ заставить это работать - установить флаг в 0,setScrollFlags(0).

Ответы на вопрос(3)

который решил эту проблему. Эта проблема возникает из-за поведения AppBarLayout (AppBarLayout.Behavior). Этот исходный код обеспечивает расширение или настройку поведения AppBarLayout и устанавливает его в AppBarLayout с введением использования как непосредственно в xml, так и в java. Я могу только кратко объяснить это, потому что у источника есть лицензия, которую вы тоже должны прочитать. Пожалуйста, посмотрите решение в этой ссылке:https://gist.github.com/chrisbanes/8391b5adb9ee42180893300850ed02f2

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

Я также заметил эту проблему, но, как новый разработчик Android, я не осознавал, что это ошибка в новой библиотеке поддержки.

То, что я хотел предложить, также добавляет эту проверку:

if( requestCancelDisallowInterceptTouchEvent ){
    if (!canScrollVertically(-1) || !canScrollVertically(1)) {
        ...
    }
}

Это позволит убедиться, что во время прокрутки RecyclerView мы не нажимаем ни на один элемент.

Как я понимаю, это ожидаемое поведение. Тем не менее, ваш ответ помог мне с этимвопрос.

 Sergey20 нояб. 2017 г., 10:28
@KimiChiu :( Надеюсь, они наконец исправят это ...
 Sergey10 нояб. 2017 г., 19:23
Привет @KimiChiu! Еще раз, я мог только прокомментировать мой ответ :) Эй! Похоже, они исправили эту ошибку в Revision 27.0.1. Бьюсь об заклад, это был твой отчетissuetracker.google.com/issues/66996774 :)) По крайней мере письмо начинается с "ki ... @ gmail.com"
 Kimi Chiu11 нояб. 2017 г., 03:53
Вы ставите. Я отредактирую свой ответ позже.
 Kimi Chiu17 нояб. 2017 г., 09:17
Похоже, проблема все еще существует в 27.0.1. Я отредактировал свой ответ как ваше предложение на тот случай, если у кого-то возникнет такая же проблема.
 Kimi Chiu05 окт. 2017 г., 06:33
Вы правы. я используюfindFirstCompletelyVisibleItemPosition а такжеfindLastCompletelyVisibleItemPosition изLayoutManager проверить, если мойRecyclerView уже прокручивается наверх или вниз. Не знал, что естьcanScrollVertically метод. Это намного элегантнее, чем использованиеLayoutManager.

ании Google, чтобы исправить эту ошибку.

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    boolean requestCancelDisallowInterceptTouchEvent = getScrollState() == SCROLL_STATE_SETTLING;
    boolean consumed = super.onInterceptTouchEvent(event);
    final int action = event.getActionMasked();

    switch (action) {
        case MotionEvent.ACTION_DOWN:
            if( requestCancelDisallowInterceptTouchEvent ){
                getParent().requestDisallowInterceptTouchEvent(false);

                // only if it touched the top or the bottom. Thanks to @Sergey's answer.
                if (!canScrollVertically(-1) || !canScrollVertically(1)) {
                    // stop scroll to enable child view to get the touch event
                    stopScroll();
                    // do not consume the event
                    return false;
                }
            }
            break;
    }

    return consumed;
}

РЕДАКТИРОВАТЬ

Эта проблема была исправлена ​​в библиотеке поддержки 27.0.1.

https://developer.android.com/topic/libraries/support-library/revisions.html#27-0-1

После прокрутки пользователь не может щелкнуть элемент в RecyclerView. (Выпуск AOSP 66996774)

Обновлено 17 ноября 2017 г.

Некоторые пользователи сообщили, что эта проблема не устранена в библиотеке поддержки 27.0.1. Отслеживание проблем здесь.https://issuetracker.google.com/issues/66996774

Таким образом, вы можете использовать этот официальный обходной путь.https://gist.github.com/chrisbanes/8391b5adb9ee42180893300850ed02f2

Или используйте это здесь.

 nyconing05 июн. 2018 г., 09:19
Проблема не в исправлении ошибок, разработчики исправили это вручную. Проблема в том, что Google также хорош в создании ошибок. Вы знаете, я боюсь обновлять API Google.
 Kimi Chiu22 февр. 2018 г., 06:31
@EpicPandaForce Мы все знали, что Google не умеет исправлять ошибки. Я все еще жду, когда они исправят ошибку хрома, из-за которой мое приложение зависало 200 раз в день. И это был почти год.
 localhost30 нояб. 2017 г., 13:15
Ты спас меня, чувак!
 EpicPandaForce21 февр. 2018 г., 18:03
The issue has been fixed in support library 27.0.1. это на самом деле совсем не исправляет меня: P 27.0.2 (еще не было времени для обходных путей)
 Kimi Chiu05 июн. 2018 г., 17:49
@nyconing Полностью согласен с вами. Это всегда катастрофа.

Ваш ответ на вопрос