簡體   English   中英

Android ViewPager2 與包含 recyclerview 的片段不滾動

[英]Android ViewPager2 with fragment containing a recyclerview not scrolling

我正在使用 ViewPager2 和 FragmentStateAdapter 來綁定片段。 我的每個片段都有 3 個垂直布局的回收站視圖。 問題是我無法在片段內滾動回收器視圖,而且當我嘗試垂直滾動內容時,視圖尋呼機會更改選項卡。 如何解決這個問題?

實際上 ViewPager2 不支持嵌套的 Scrollable 元素,因此要支持具有相同方向的 ViewPager2 對象內的滾動視圖,您必須調用 requestDisallowInterceptTouchEvent() 或將您的嵌套滾動視圖包裝在此類中

此外,您可以閱讀本文以了解如何在 ViewPager2 中支持嵌套的可滾​​動元素

嘗試 view_pager.setUserInputEnabled(false),它對我有用。

來自https://medium.com/@ankurg22/viewpager2-on-the-outside-recyclerview-inside-a005adb5d63d

我遇到了同樣的問題,我有三個帶有垂直 recyclerview 的頁面,每個頁面都是 viewpager2 中的一個單獨的片段。

我正在做的是計算 x 和 y 方向的滾動,如果 y 方向的滾動更多,我將禁用觸摸。

public class CustomScrollHost extends FrameLayout {
    private float xDistance, yDistance, lastX, lastY;

    public CustomScrollHost(@NonNull Context context) {
        super(context);
    }

    public CustomScrollHost(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomScrollHost(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public CustomScrollHost(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                xDistance = yDistance = 0f;
                lastX = ev.getX();
                lastY = ev.getY();
                getParent().requestDisallowInterceptTouchEvent(true);
                break;
            case MotionEvent.ACTION_MOVE:
                final float curX = ev.getX();
                final float curY = ev.getY();
                xDistance += Math.abs(curX - lastX);
                yDistance += Math.abs(curY - lastY);
                lastX = curX;
                lastY = curY;
                Log.d("CustomScrollHost", "xDistance " + xDistance);
                Log.d("CustomScrollHost", "yDistance " + yDistance);
                getParent().requestDisallowInterceptTouchEvent(yDistance > xDistance);
        }
        return super.onInterceptTouchEvent(ev);
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM