यह केवल आंशिक उत्तर है; मैं पहेली के एक टुकड़े (कम से कम) लापता हूं, लेकिन उम्मीद है कि कोई और इसे समझ सकता है।
बार जब आप अपने <RecyclerView>
टैग करने के लिए आवश्यक विशेषताएं जोड़ी हैं (के रूप में जवाब ओपी के प्रश्न में जुड़े हुए में उल्लेख किया है), आकार/स्क्रॉलबार अंगूठे की स्थिति LinearLayoutManager
अंदर तीन विधियों द्वारा नियंत्रित किया जाता:
int computeVerticalScrollRange()
: स्क्रॉलबार के ट्रैक का आकार।
int computeVerticalScrollExtent()
: स्क्रॉलबार के अंगूठे का आकार।
int computeVerticalScrollOffset()
: स्क्रॉलबार के ट्रैक के शीर्ष और स्क्रॉलबार के अंगूठे के शीर्ष के बीच की दूरी।
इन विधियों के लिए इकाइयां मनमानी हैं; आप तब तक कुछ भी उपयोग कर सकते हैं जब तक आप सभी तीन विधियों को एक ही इकाइयों को साझा न करें।
mSmoothScrollbarEnabled == true
: डिफ़ॉल्ट रूप से, LinearLayoutManager
इकाइयों के दो सेट में से एक का उपयोग करेगा RecyclerView
में दिखाई दे मदों की पिक्सेल आकार के आधार पर उपयोग इकाइयों।
mSmoothScrollbarEnabled == false
: RecyclerView
के एडाप्टर में दृश्यमान वस्तुओं की स्थिति के आधार पर इकाइयों का उपयोग करें।
स्क्रॉलबार के अंगूठे के आकार को नियंत्रित करने के अपने आप को, आप इन तरीकों को ओवरराइड करना होगा ... लेकिन यहाँ टुकड़ा मैं याद कर रहा हूँ है: मेरे प्रयोग के सभी में, computeVerticalScrollExtent()
से कभी नहीं कहा जाता है सिस्टम। उस ने कहा, हम अभी भी कुछ प्रगति दिखा सकते हैं।
सबसे पहले, मैंने एक साधारण एडाप्टर बनाया है जो 500 CardView
एस को आइटम की स्थिति के साथ दिखाता है। मैंने कुछ वास्तव में सरल (लेकिन बदसूरत) ड्रॉबल्स के साथ तेजी से स्क्रॉलिंग सक्षम की है। यहाँ स्क्रॉलबार सिर्फ एक डिफ़ॉल्ट LinearLayoutManager
कार्यान्वयन के साथ कैसा दिखता है:
आप 500 (छोटे) आइटम के साथ, मिल गया है के रूप में, स्क्रॉलबार अंगूठे वास्तव में छोटे और काफी पर दोहन करने के लिए कठिन है। हम केवल एक निश्चित निरंतर लौटने के लिए computeVerticalScrollRange()
ओवरराइड करके स्क्रॉलबार नाटकीय रूप से बड़े कर सकते हैं ...मैं तो बस बड़ा परिवर्तन को दिखाने के लिए यादृच्छिक पर अनिवार्य रूप से 5000
उठाया:
बेशक
, अब स्क्रॉलबार की तरह आप उम्मीद थी काम नहीं करता है; सामान्य रूप से ड्रैग करके सूची को स्क्रॉल करके अंगूठे को जितना अधिक होना चाहिए, और अंगूठे पर खींचकर सूची को तेजी से स्क्रॉल करना सूची को उससे कम कम करना चाहिए।
मेरे डिवाइस पर, 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
कार्यान्वयन खाते में डिवाइस अभिविन्यास, सूची में पहली और आखिरी दृश्यमान वस्तुओं, दोनों दिशाओं में ऑफ-स्क्रीन आइटमों की संख्या, चिकनी स्क्रॉलिंग, विभिन्न लेआउट झंडे आदि शामिल हैं।
मेरी ऐप में एक ही समस्या है। क्या हम एक फिक्स अंगूठे को परिभाषित कर सकते हैं, जो सूची आकार के आधार पर छोटा नहीं हो रहा है? – egmontr
मेरी ऐप –
में वही समस्या उपर्युक्त उत्तर बहुत सीमित है। यहां एक [उदाहरण] है (https://bitbucket.org/StylingAndroid/scrollingrecyclerview/src/2fc7d871b911144b492744bb3a5097bb01869ac1?at=Part1) जो आप करना चाहते हैं। –