2016-10-30 6 views
7

मैं बहुत हाल ही में SnapHelper क्रम में Support Library v24 अंदर का प्रयोग करके बहुत पसंद में Google Play स्टोर एक अच्छा क्षैतिज RecyclerView के लिए शुरू कर दिया।RecyclerView और SnapHelper -> बोले मिल/लक्षित दृश्य

मेरा प्रश्न सरल है।

एक RecyclerView.OnScrollListener मैं जब स्क्रॉल राज्य निपटाने (ज्यादा ViewPager.OnPageChangedListener साथ की तरह है अधिसूचित किया जा सकता का उपयोग करके। यह महत्वपूर्ण है क्योंकि जब स्क्रॉल बसने है, मैं विचार है कि डिफ़ॉल्ट व्यवहार के रूप केंद्रित किया जाएगा चेतन करने की जरूरत है LinearSnapHelper की। यही कारण है कि एनीमेशन पता चलता है कि फोकस अभी के लिए जल्द ही होने वाली हो केंद्रित आइटम

में लाया जाता है, मैं दृश्य जब स्क्रॉल राज्य के माध्यम से निष्क्रिय है केंद्रित है कि पाने में कामयाब रहे निम्नलिखित पंक्ति:

final int centered = (llm.findLastCompletelyVisibleItemPosition() - llm.findFirstCompletelyVisibleItemPosition())/2 + llm.findFirstVisibleItemPosition(); // where llm is my LinearLayoutManager 

समस्या यह है कि स्क्रॉल पूरा होने पर एनीमेशन शुरू करना अजीब है: स्क्रॉल निष्क्रिय होने पर मुझे एनीमेशन को आसानी से चलाने की ज़रूरत है ताकि जब स्क्रॉल निष्क्रिय हो, तो एनीमेशन भी पूरा हो जाता है।

तो जैसा कि आप देख सकते हैं, मुझे यह पता लगाना मुश्किल है कि मेरे RecyclerView का कौन सा आइटम एक केंद्रित होगा।


यहां समाधान हैं जिनसे मैंने अभी तक प्रयास किया है।

  1. स्क्रॉल स्थिति RecyclerView.SCROLL_STATE_SETTLING पर सेट होने पर मैंने उसी गणना का उपयोग करने की कोशिश की। दुर्भाग्यवश, स्क्रॉल निष्क्रिय नहीं होने पर एडाप्टर से findVisiblePosition विधियों को कॉल करना एक बुरा विचार है: स्क्रॉल की गति के आधार पर, दृश्यमान आइटम, जब इन तथाकथित विधियों को लागू किया जाता है, तो स्क्रॉल होने पर बिल्कुल वही नहीं हो सकता है पूर्ण। दरअसल यह मुझे बताएगा कि कॉल के समय कौन सी चीजें दिखाई दे रही हैं। यही कारण है कि कुल समझ में आता है लेकिन मुझे लगता है कि खोजने के लिए बाहर की कोशिश करने के लिए आवश्यक ...

  2. मैंने कोशिश की विस्तार LinearSnapHelper ताकि जब onFling(...) मैं या तो findSnapView(...) का उपयोग का मानना ​​है कि हो जाएगा प्राप्त करने के लिए कर सकते हैं कहा जाता है बोले या का उपयोग करें उम्मीद है कि स्क्रॉल पूरा होने पर मुझे कौन सा दृश्य केंद्रित किया जाना चाहिए;

  3. मैं भी कोशिश की, जब स्क्रॉल राज्य RecyclerView.SCROLL_STATE_SETTLING है, (विभिन्न कड़ी चोट ताकत & गति के साथ की कोशिश कर रहा) findSnapView(...)

इन सभी समाधान के

, कोई भी कई परीक्षण पारित कर दिया उपयोग करने के लिए। कुछ लोगों ने इसे कुछ मौकों पर सही पाया लेकिन विभिन्न परिस्थितियों में यह गलत हो गया, इसलिए समाधान को अनुपयोगी बना दिया गया।

LinearSnapHelper के अंदर देखा गया मुझे लगता है कि मैंने इसे समझना शुरू कर दिया है, किसी भी तरह, एक स्वाइप के बाद, यह वर्ग कुल स्क्रॉल की गणना करता है और स्क्रॉल पूर्ण होने से पहले आवश्यक होने पर कई अवसरों पर विचारों को स्नैप करता है (स्क्रॉल करने की दूरी की मात्रा) इसलिए यह जानना कि कौन सा दृश्य अंतिम स्नैप दृश्य होगा ... जब तक मुझे यह सब गलत नहीं मिला क्योंकि स्नैप केंद्रित नहीं है?

वैसे भी, मेरा मुख्य प्रश्न यह है: मुझे कैसे पता चलेगा कि मेरे RecyclerView की कौन सा वस्तु स्वाइप के बाद केंद्रित होगी, चाहे गति और गति की गति के बावजूद?

उत्तर

1

यदि आप LinearSnapHelper का उपयोग कर रहे हैं, तो LinearSnapHelper#findTargetSnapPosition विधि है। यह दृश्य के एडाप्टर स्थिति को स्नैप करने के लिए देता है।

0

स्क्रॉलिंग के दौरान आप layoutManager.findFirstCompletelyVisibleItemPosition() का उपयोग कर सकते हैं।

+0

धन्यवाद, लेकिन मैं यह जानना चाहता हूं कि कौन सा आइटम केंद्रित होगा ** ** स्वाइप के बाद स्वाइप नहीं होने पर। – Mackovich

4

आपको SnapHelper उपclass और findTargetSnapPosition ओवरराइड करने की आवश्यकता है। super.findTargetSnapPosition(layoutManager, velocityX, velocityY) द्वारा गणना की गई स्थिति आपकी RecyclerView स्थिति को स्नैप करने जा रही है।

SnapHelper snapHelper = new LinearSnapHelper() { 
    @Override 
    public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) { 
     int snapPosition = super.findTargetSnapPosition(layoutManager, velocityX, velocityY); 

     // Do something with snapPosition 

     return snapPosition; 
    } 
}; 
+1

यह ज्यादातर सच नहीं है। यह अक्सर होता है कि 'findTargetSnapPosition' रिटर्न -1 को स्नैप करते समय -1। – mradzinski

+0

@mradzinski आपके सेटअप के बारे में कुछ अजीब होना चाहिए। मैं इस दृष्टिकोण का उपयोग बिना किसी परेशानी के बहुत लंबे समय तक कर रहा हूं। –

संबंधित मुद्दे