Я только что обновил API 26 и поддерживал библиотеку 26.0.2. Но я обнаружил, что мои объекты RecyclerView
не могут быть изменены сразу после прокрутки. Если вы подождете секунду, это сработает. Но если вы сразу же щелкнете по элементу, это не произойдет. Даже если RecyclerView
не прокручивается вообще (например, прокручивается вверх).
Когда я перешел на поддержку библиотеки 25.4.0, все будет хорошо.
Ключевым моментом является то, что мой RecyclerView
находится в CoordinatorLayout
и имеет флаг SCROLL_FLAG_SCROLL
на Toolbar
AppBarLayout
. Если я не буду использовать этот флаг, эта проблема исчезнет. Поэтому я считаю, что это скрытое изменение поведения библиотеки поддержки.
Я попытался добавить focusable="false"
в CoordinatorLayout
, но все равно не повезло.
Есть ли способ отключить это поведение? Потому что это очень раздражает щелкнуть дважды, чтобы вызвать событие click.
<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()
не возвращает true сразу после RecyclerView
остановки прокрутки, когда он коснулся вершины. Возможно, это ошибка RecyclerView
, когда она находится в CoordinatorLayout
.