【问题标题】:Parent RecyclerView picks up gestures that were intended to be for the nested RecyclerView父 RecyclerView 拾取旨在用于嵌套 RecyclerView 的手势
【发布时间】:2020-11-25 03:53:18
【问题描述】:

我有一个垂直的RecyclerView 和一个嵌套的水平RecyclerView 作为它的孩子之一。内部视图用作带有PagerSnapHelper 的图像轮播。当我尝试水平滚动内部视图时,我的行为不太理想。有时,即使我的意图是水平滚动内部视图,父视图也会选择手势并垂直滚动。有没有办法配置默认滚动检测器,使水平滚动更流畅?

【问题讨论】:

    标签: android android-recyclerview carousel horizontal-scrolling


    【解决方案1】:

    您可以尝试将此RecyclerViewoverriden method 作为父RecyclerView 一起使用:

    public class CustomRecyclerView extends RecyclerView {
    
        private int mTouchSlop;
        private float mPrevX;
    
        public CustomRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
            mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent e) {
            switch (e.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mPrevX = MotionEvent.obtain(e).getX();
                    break;
    
                case MotionEvent.ACTION_MOVE:
                    final float eventX = e.getX();
                    float xDiff = Math.abs(eventX - mPrevX);
    
                    if (xDiff > mTouchSlop) {
                        return false;
                    }
            }
    
            return super.onInterceptTouchEvent(e);
        }
    }
    

    xml 中的示例

    <com.example.stackoverflow.CustomRecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    

    【讨论】:

    • 感谢这个伟大的 sn-p!你能解释一下为什么你调用obtain函数而不是e.getX()吗?
    • sn-p 不是我的...我从旧代码中找到了它,我在 swiperefreshLayout 内部遇到了 webview 问题。我确实设置了示例项目并实现了您的场景,以查看它是否可以与 RecyclerView 一起使用 - 确实如此。它对你有用吗?如果我找到它,我会发布原始答案的链接。
    • 我还在测试,不知道它是否有效。我注意到的一件事是嵌套的RecyclerView 仅在父滚动状态为空闲时才拾取手势。在 iOS 上,这更自然(即嵌套的子级可以在父级仍在滚动时拾取手势)。你知道如何改变 Android 的行为吗?
    • 不,我不知道。而且我相信这是不可能的——在 android 上还没有看到任何可以做到这一点的应用程序,即使是谷歌的 youtube(我认为它是本地开发的)。
    【解决方案2】:

    下面的方法是在触摸嵌套的recyclerview时尝试禁用父recyclerview的触摸事件。

        nestedRecyclerView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch (View v, MotionEvent event){
        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                // Disallow parent to intercept touch events.
                v.getParent().requestDisallowInterceptTouchEvent(true);
                break;
    
            case MotionEvent.ACTION_UP:
                // Allow parent to intercept touch events.
                v.getParent().requestDisallowInterceptTouchEvent(false);
                break;
        }
    
        // Handle inner(child) touch events.
        v.onTouchEvent(event);
        return true;
    }
    });
    

    【讨论】:

      猜你喜欢
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      相关资源
      最近更新 更多