android SwipeRefreshLayout के अंदर क्षैतिज स्क्रॉल दृश्य




horizontalscrollview (3)

मैंने इसे SwipeRefreshLayout को विस्तारित SwipeRefreshLayout और इसके onInterceptTouchEvent ओवरराइड करके हल किया। अंदर, मैं गणना करता हूं कि उपयोगकर्ता की दूरी की दूरी एक्स टच ढलान से बड़ी है या नहीं। यदि ऐसा होता है, तो इसका मतलब है कि उपयोगकर्ता क्षैतिज रूप से स्वाइप कर रहा है, क्योंकि मैं 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 SwipeRefreshLayout को प्राप्त करने से रोकता है और रीफ्रेश करने के लिए लंबवत स्क्रॉल करना प्रारंभ करता है।

मैंने इस मुद्दे को हल करने का प्रयास किया क्योंकि मैंने पहले requestDisallowInterceptTouchEvent का उपयोग करके, ViewPager साथ वर्टिकल ScrollView साथ समस्याओं को हल किया था, लेकिन यह काम नहीं किया। मैंने यह भी देखा कि सुपर विधि को वापस किए बिना मूल SwipeRefreshLayout क्लास में यह विधि ओवरराइड की गई है। Google के डेवलपर ने " //Nope. " के बजाय एक टिप्पणी छोड़ी :)

चूंकि SwipeRefreshLayout घटक अपेक्षाकृत नया है, मुझे एक समाधान नहीं मिला जो क्षैतिज स्क्रॉल समस्या को हल करता है जबकि अभी भी स्वाइप स्क्रॉलिंग को ट्रैक करने और संभालने के लिए स्वाइप को रीफ्रेश करने की इजाजत देता है, इसलिए मैंने सोचा कि मैं उम्मीद के साथ अपना समाधान साझा करूंगा कि यह किसी को छोड़ देगा घंटा या दो।


यदि आप टिम रोस एन्हांस्ड लिस्ट व्यू का उपयोग करते हैं

इन issues देखें। मैं अपने लिए बहुत उपयोगी था क्योंकि वे एक फोन्क्शन जोड़ते हैं जो स्वाइप शुरू करते हैं और स्वाइप खत्म होने पर पता लगाते हैं।

स्वाइप शुरू होने पर, मैं SwipeRefreshLayout को अक्षम करता हूं और जब स्वाइप समाप्त करता हूं, तो मैं स्वाइप RefreshLayout को लागू करता हूं।


यदि आप इस तथ्य को याद नहीं करते हैं कि आपने 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);
    }
}




swiperefreshlayout