AppBarLayout + RecycleView 滑动后,item 在一段时间内无法点击的问题

复现

今天开发过程中偶然发现了这个问题。

仔细观察重现条件:

1. 快速滑动 RecycleView 后,立即去点击 item 往往没有反应,第二次点击或者等待片刻后点击可以生效。

2. 缓慢滑动后,立即点击 item,发现大多数情况下是有反应的。

猜测

由上述现象猜测,bug 的发生可能与滑动有关,快速滑动后,recycleview 可能还处于某种滑动状态,而这种状态因为列表已经滑动到尽头而不可见。

尝试

继续尝试发现单独使用 RecycleView,或者在 AppLayoutBar 中不使用 CollapsingToolbarLayout 无此 bug。

定位

那么应该是和 NestScroll 相关了,重写 AppBarLayout.Behavior 打印 log,发现在快速滑动到顶部和底部之后,AppBarLayout 在一段时间内还处于 Fling 状态,那么我们想办法把这段无效的 Fling 干掉就好了。

解决

最后翻找 google 的时候发现这是 google 在修复上个版本嵌套滑动的时候引进来的新 bug。。。

@Keep
public class FixAppBarLayoutBehavior extends AppBarLayout.Behavior {

    public FixAppBarLayoutBehavior() {
        super();
    }

    public FixAppBarLayoutBehavior(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);
            }
        }
    }
}
最后在 AppBarLayout 中使用这个 behavior

猜你喜欢

转载自blog.csdn.net/ganyao939543405/article/details/80651582
今日推荐