[Android] RecyclerViewのスクロール直後にクリックが動作しない

事象

CoordinatorLayout + AppBarLayout + RecyclerViewのようなレイアウトにおいて、RecyclerViewを端までスクロールさせた際、直後数秒間1回目のタップが動作しない不具合が発生しました。

原因

コンポーネント自体の不具合のようです。
AOSP issue 66996774

解決策

方法1

Support Libraryのバージョン 27.0.1 で修正されたとのアナウンスがありました(https://developer.android.com/topic/libraries/support-library/revisions#bug-fixes_8)
が、アップデートしても改善されないとの声が多くあります。
一応build.gradleよりアップデートを試してみて、改善されない場合は以下の方法をお試しください。

方法2

以下のリンク先のようにAppBarLayout.Behaviorを修正する方法です。基本的にはこちらで対応してください。
Fixed AppBarLayout.Behavior for https://issuetracker.google.com/66996774 · GitHub

方法3

ほとんど方法2と変わりませんが、以下のようにAppBarLayoutを拡張してもいいかもしれません(推奨はしません)。

FixedAppBarLayout.java

public class FixedAppBarLayout extends AppBarLayout {

    public FixedAppBarLayout(Context context) {
        super(context, null);
    }

    public FixedAppBarLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setLayoutParams(ViewGroup.LayoutParams params) {
        if (params instanceof CoordinatorLayout.LayoutParams) {
            ((CoordinatorLayout.LayoutParams) params).setBehavior(new FixedAppBarLayoutBehavior());
        }
        super.setLayoutParams(params);
    }

    // 以下、方法2と同じ
    public static class FixedAppBarLayoutBehavior extends AppBarLayout.Behavior {

        public FixedAppBarLayoutBehavior() {
            super();
        }

        public FixedAppBarLayoutBehavior(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        @Override
        public void onNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target,
                                   int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type) {
            super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed,
                    dxUnconsumed, dyUnconsumed, type);
            stopNestedScrollIfNeeded(dyUnconsumed, child, target, type);
        }

        @Override
        public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child,
                                      View target, int dx, int dy, int[] consumed, int type) {
            super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
            stopNestedScrollIfNeeded(dy, child, target, type);
        }

        private void stopNestedScrollIfNeeded(int dy, AppBarLayout child, View target, int type) {
            if (type == ViewCompat.TYPE_NON_TOUCH) {
                final int currOffset = getTopAndBottomOffset();
                if ((dy < 0 && currOffset == 0)
                        || (dy > 0 && currOffset == -child.getTotalScrollRange())) {
                    ViewCompat.stopNestedScroll(target, ViewCompat.TYPE_NON_TOUCH);
                }
            }
        }

    }

}

layout.xml

<パッケージ.FixedAppBarLayout
    android:layout_height="..."
    android:layout_width="...">