如何防止触摸过早地停止 RecyclerView 中的 smoothScroll?

How to prevent touches prematurely stopping smoothScroll in RecyclerView?

我正在使用 Adapter 来填充 RecyclerView 多个 CardView 布局(水平)。每个 CardView 在布局底部都有一个 Button,按下时提示调用:

recyclerView.smoothScrollBy(x, y);

这会按预期水平滚动到下一张卡片,除非用户在滚动时触摸屏幕。我曾尝试为 RecyclerViewCardView 禁用 TouchEvent 但无济于事。

我显然不能指望用户在这个滚动动画期间不触摸屏幕,所以我想知道是否有人对滚动过早停止的原因以及我如何停止它有任何想法。

谢谢。

在滚动之前禁用用户交互并在滚动之后启用它们。我会使用 window 标志:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

recyclerView.smoothScrollBy(x, y);

new Handler().postDelayed(new Runnable() {
   public void run(){
      getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
   }
}, 500);

问题是onInterceptTouchEvent

如果你以这种方式将侦听器添加到 recyclerView:

    addOnItemTouchListener(object : RecyclerView.SimpleOnItemTouchListener() {
        override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
            return true
        }
    })
  1. 如果它是 return true 你不能手动滚动 recyclerView(你可以通过编程方式)
  2. 如果是return真正的滚动是stopped/interrupted

这个选项对我有用(将它添加到 recyclerView 与之前的代码片段(以防止手动滚动)以防止触摸时滚动中断):

override fun onInterceptTouchEvent(e: MotionEvent): Boolean {
    if (layoutManager?.isSmoothScrolling == true || scrollState == SCROLL_STATE_SETTLING) {
        return true
    }
    return super.onInterceptTouchEvent(e)
}

override fun onTouchEvent(e: MotionEvent): Boolean {
    if (layoutManager?.isSmoothScrolling == true || scrollState == SCROLL_STATE_SETTLING) {
        return true
    }
    return super.onTouchEvent(e)
}