2017-12-16 93 views
7

के लिए तेज़ स्क्रॉल अंगूठे की ऊंचाई बहुत छोटा देखें I डिफ़ॉल्ट RecyclerView फास्ट स्क्रॉल का उपयोग कर रहा हूं और मैंने इसका समर्थन करने के लिए this guide का पालन किया।पुनर्चक्रण बड़े डेटा सेट

अब समस्या यह है कि अंगूठे डेटा सेट के आकार के अनुसार अपनी ऊंचाई का आकार बदलती है। 100 से ऊपर की तरह बड़ी वस्तुओं के लिए, अंगूठे बहुत छोटा हो जाता है और खींचने के जवाब देने में लगभग मुश्किल हो जाती है।

कृपया कोई भी तरीका है कि मैं तेज़ स्क्रॉल अंगूठे के लिए न्यूनतम ऊंचाई निर्धारित कर सकता हूं।

+2

मेरी ऐप में एक ही समस्या है। क्या हम एक फिक्स अंगूठे को परिभाषित कर सकते हैं, जो सूची आकार के आधार पर छोटा नहीं हो रहा है? – egmontr

+1

मेरी ऐप –

+0

में वही समस्या उपर्युक्त उत्तर बहुत सीमित है। यहां एक [उदाहरण] है (https://bitbucket.org/StylingAndroid/scrollingrecyclerview/src/2fc7d871b911144b492744bb3a5097bb01869ac1?at=Part1) जो आप करना चाहते हैं। –

उत्तर

3

यह केवल आंशिक उत्तर है; मैं पहेली के एक टुकड़े (कम से कम) लापता हूं, लेकिन उम्मीद है कि कोई और इसे समझ सकता है।

बार जब आप अपने <RecyclerView> टैग करने के लिए आवश्यक विशेषताएं जोड़ी हैं (के रूप में जवाब ओपी के प्रश्न में जुड़े हुए में उल्लेख किया है), आकार/स्क्रॉलबार अंगूठे की स्थिति LinearLayoutManager अंदर तीन विधियों द्वारा नियंत्रित किया जाता:

  • int computeVerticalScrollRange(): स्क्रॉलबार के ट्रैक का आकार।

  • int computeVerticalScrollExtent(): स्क्रॉलबार के अंगूठे का आकार।

  • int computeVerticalScrollOffset(): स्क्रॉलबार के ट्रैक के शीर्ष और स्क्रॉलबार के अंगूठे के शीर्ष के बीच की दूरी।

इन विधियों के लिए इकाइयां मनमानी हैं; आप तब तक कुछ भी उपयोग कर सकते हैं जब तक आप सभी तीन विधियों को एक ही इकाइयों को साझा न करें।

  • mSmoothScrollbarEnabled == true: डिफ़ॉल्ट रूप से, LinearLayoutManager इकाइयों के दो सेट में से एक का उपयोग करेगा RecyclerView में दिखाई दे मदों की पिक्सेल आकार के आधार पर उपयोग इकाइयों।

  • mSmoothScrollbarEnabled == false: RecyclerView के एडाप्टर में दृश्यमान वस्तुओं की स्थिति के आधार पर इकाइयों का उपयोग करें।

स्क्रॉलबार के अंगूठे के आकार को नियंत्रित करने के अपने आप को, आप इन तरीकों को ओवरराइड करना होगा ... लेकिन यहाँ टुकड़ा मैं याद कर रहा हूँ है: मेरे प्रयोग के सभी में, computeVerticalScrollExtent() से कभी नहीं कहा जाता है सिस्टम। उस ने कहा, हम अभी भी कुछ प्रगति दिखा सकते हैं।

सबसे पहले, मैंने एक साधारण एडाप्टर बनाया है जो 500 CardView एस को आइटम की स्थिति के साथ दिखाता है। मैंने कुछ वास्तव में सरल (लेकिन बदसूरत) ड्रॉबल्स के साथ तेजी से स्क्रॉलिंग सक्षम की है। यहाँ स्क्रॉलबार सिर्फ एक डिफ़ॉल्ट LinearLayoutManager कार्यान्वयन के साथ कैसा दिखता है:

enter image description here

आप 500 (छोटे) आइटम के साथ, मिल गया है के रूप में, स्क्रॉलबार अंगूठे वास्तव में छोटे और काफी पर दोहन करने के लिए कठिन है। हम केवल एक निश्चित निरंतर लौटने के लिए computeVerticalScrollRange() ओवरराइड करके स्क्रॉलबार नाटकीय रूप से बड़े कर सकते हैं ...मैं तो बस बड़ा परिवर्तन को दिखाने के लिए यादृच्छिक पर अनिवार्य रूप से 5000 उठाया:

enter image description here

बेशक

, अब स्क्रॉलबार की तरह आप उम्मीद थी काम नहीं करता है; सामान्य रूप से ड्रैग करके सूची को स्क्रॉल करके अंगूठे को जितना अधिक होना चाहिए, और अंगूठे पर खींचकर सूची को तेजी से स्क्रॉल करना सूची को उससे कम कम करना चाहिए।

मेरे डिवाइस पर, 5000 के बेतरतीब ढंग से चुने हुए सीमा के साथ, computeVerticalScrollOffset() अधिभावी इस प्रकार के रूप में मैं इस पर खींचकर सूची स्क्रॉल स्क्रॉलबार अंगूठे पूरी तरह से ले जाने के लिए बनाता है:

@Override 
public int computeVerticalScrollRange(RecyclerView.State state) { 
    return 5000; 
} 

@Override 
public int computeVerticalScrollOffset(RecyclerView.State state) { 
    return (int) (super.computeVerticalScrollOffset(state)/23.5f); 
} 

बहरहाल, यह अभी नहीं करता है ' दूसरे मुद्दे को ठीक नहीं करें: अंगूठे पर खींचने से सूची को सही तरीके से स्क्रॉल नहीं किया जाता है। जैसा कि मैंने ऊपर बताया है, ऐसा लगता है कि यहां करने के लिए उपयुक्त चीज computeVerticalScrollExtent() को ओवरराइड करना होगा, लेकिन सिस्टम इस विधि को कभी भी आमंत्रित नहीं करेगा। मैंने इसे अपवाद फेंकने के लिए भी ओवरराइड किया है, और मेरा ऐप कभी दुर्घटनाग्रस्त नहीं होता है।

उम्मीद है कि यह कम से कम लोगों को पूर्ण समाधान के लिए सही दिशा में इंगित करने में मदद करता है।

पीएस: computeVerticalScrollRange() और computeVerticalScrollOffset() के कार्यान्वयन मैंने इस उत्तर में शामिल किया है जानबूझकर सरल (पढ़ना: फर्जी)। "असली" कार्यान्वयन बहुत जटिल होगा; डिफ़ॉल्ट LinearLayoutManager कार्यान्वयन खाते में डिवाइस अभिविन्यास, सूची में पहली और आखिरी दृश्यमान वस्तुओं, दोनों दिशाओं में ऑफ-स्क्रीन आइटमों की संख्या, चिकनी स्क्रॉलिंग, विभिन्न लेआउट झंडे आदि शामिल हैं।

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