android - HorizontalScrollView داخل SwipeRefreshLayout




(4)

أنا حلها عن طريق تمديد SwipeRefreshLayout وتجاوز onInterceptTouchEvent لها. في الداخل ، أحسب إذا كانت المسافة X التي تجولها المستخدم أكبر من المسافة المسة. إذا كان الأمر كذلك ، فهذا يعني أن المستخدم يقوم بالتمرير أفقياً ، لذلك أعود إلى false مما يتيح عرض الطفل ( HorizontalScrollView في هذه الحالة) للحصول على حدث اللمس.


public class CustomSwipeToRefresh extends SwipeRefreshLayout {

    private int mTouchSlop;
    private float mPrevX;

    public CustomSwipeToRefresh(Context context, AttributeSet attrs) {
        super(context, attrs);

        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mPrevX = MotionEvent.obtain(event).getX();
                break;

            case MotionEvent.ACTION_MOVE:
                final float eventX = event.getX();
                float xDiff = Math.abs(eventX - mPrevX);

                if (xDiff > mTouchSlop) {
                    return false;
                }
        }

        return super.onInterceptTouchEvent(event);
    }
}

قمت بتطبيق المكون الجديد SwipeRefreshLayout في التطبيق الخاص بي ويعمل بشكل جيد مع أي طرق عرض عمودية مثل ListView و GridView و ScrollView .

يتصرف بشكل سيء للغاية مع وجهات النظر الأفقية ، مثل HorizontalScrollView . عند التمرير إلى اليمين أو اليسار ، يقوم عرض SwipeRefreshLayout بتخزين اللمس ، ويمنع HorizontalScrollView من استلامه ويبدأ في التمرير عموديًا لإجراء التحديث.

حاولت حل هذه المسألة كما سبق لي أن حل القضايا مع ScrollView العمودي مع ViewPager الداخل ، وذلك باستخدام requestDisallowInterceptTouchEvent لكنه لم يعمل. كما أنني لاحظت أن هذا الأسلوب قد تم تجاوزه في فئة SwipeRefreshLayout الأصلية دون إعادة السوبر. ترك مطور Google تعليقًا بدلاً من ذلك " //Nope. " :)

نظرًا لأن مكون SwipeRefreshLayout جديد نسبيًا ، لم أتمكن من العثور على حل يعمل على إصلاح مشكلة التمرير الأفقية مع الاستمرار في تمكين التمرير لتحديث العرض لتعقب التمرير الرأسي ومعالجته ، لذلك أعتقد أنني سوف أشارك الحل الخاص بي مع الأمل في أن يحفظ شخصًا ما ساعة أو ساعتين.


إذا كنت تستخدم تيم رووز EnhancedListView

انظر هذه issues . كنت مفيدة جدا بالنسبة لي لأنها تضيف fonction الذي يكشف عندما تبدأ انتقاد وعندما تنتهي من انتقاد.

عند بدء التمرير ، أقوم بتعطيل SwipeRefreshLayout وعندما تنتهي من التمرير ، أقوم بتمرير swipeRefreshLayout.


إذا لم تقم بحفظ حقيقة أنك قد رفضت بالفعل حدث ACTION_MOVE ، فستتخذه في النهاية في وقت لاحق إذا عاد المستخدم مرة أخرى بالقرب من mPrevX الأولي الخاص بك.

فقط أضف قيمة منطقية لحفظها.

public class CustomSwipeToRefresh extends SwipeRefreshLayout {

    private int mTouchSlop;
    private float mPrevX;
    // Indicate if we've already declined the move event
    private boolean mDeclined;

    public CustomSwipeToRefresh(Context context, AttributeSet attrs) {
        super(context, attrs);

        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mPrevX = MotionEvent.obtain(event).getX();
                mDeclined = false; // New action
                break;

            case MotionEvent.ACTION_MOVE:
                final float eventX = event.getX();
                float xDiff = Math.abs(eventX - mPrevX);

                if (mDeclined || xDiff > mTouchSlop) {
                    mDeclined = true; // Memorize
                    return false;
                }
        }

        return super.onInterceptTouchEvent(event);
    }
}

الحاوية التفصيلية هي FrameLayout لأنه سيتم استبدال Fragment الذي يتم عرضه باستخدام أسلوب replace() FragmentTransaction .

الوسيطة الأولى replace() هي معرف الحاوية الذي سيتم استبدال القطع الخاصة به. إذا تم استبدال FrameLayout في هذا المثال بشظية ، فسيتم استبدال كل جزء WorkStationListFragment وأي جزء من التفاصيل بالتفصيل بالشظية الجديدة. من خلال تغليف جزء داخل FrameLayout ، يمكنك استبدال التفاصيل فقط.





android horizontalscrollview swiperefreshlayout