Android ListView शीर्ष पर स्क्रॉल करना


80

मैं एक ListViewकस्टम पंक्तियों के साथ है। जब इन पंक्तियों में से किसी पर क्लिक किया जाता है, तो सूची दृश्य का डेटा पुनः प्राप्त होता है। जब ऐसा होता है तो मैं सूची को शीर्ष पर वापस स्क्रॉल करना चाहता हूं।

मैंने शुरू setSelection(0)में OnClickListener इसे प्राप्त करने के लिए प्रत्येक पंक्ति का उपयोग करने की कोशिश की, लेकिन असफल रहा (मेरा मानना ​​है कि क्योंकि ListView इसका डेटा अमान्य होने पर अपनी स्क्रॉल स्थिति खो देता है - इसलिए सेटस्लेक्शन के लिए मेरा कॉल पूर्ववत है। मुझे अभी भी समझ में नहीं आया कि लिस्ट व्यू को कैसे स्क्रॉल करना है जहां स्क्रॉल करना है। अमान्य होने के बाद, हालांकि)।

एकमात्र काम करने वाला समाधान जो मुझे पता है कि रोमेन गाय ने यहां दिया था: http://groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301

इसमें ( View.post) कॉल को सम्मिलित करना शामिल है_listView.setSelection(0) । मुझे यह काफी खराब प्रदर्शन करने के लिए मिला। नई जनरेट की गई सूची इसके स्क्रॉल स्थान के साथ अपरिवर्तित दिखाई देती है और शीर्ष पर वापस स्क्रॉल करने से पहले काफी विलंब होता है।

क्या इस कार्यक्षमता को प्राप्त करने का कोई बेहतर तरीका है?

कोई भी सहायताकाफी प्रशंसनीय होगी।

धन्यवाद!

जवाबों:



102

मैंने बहुत कोशिश की लेकिन यह मेरे लिए काम कर गया

list.smoothScrollToPosition(0);

3
यह कमाल का है। मुझे आश्चर्य है कि क्या आप स्क्रॉल गति को बदल सकते हैं।
२२:३३ पर theblang

क्या यह जानने के लिए भी कॉलबैक हो सकता है कि स्कोल कब खत्म होगा ताकि मैं अगली स्क्रीन पर जा सकूं?
अमोल गुप्ता

41

मैं बस उपयोग करता हूं listview.setSelection(0);

मेरे लिए ठीक काम करता है।


5

यदि आपको ListViewएडॉप्टर के डेटा को बदलने के तुरंत बाद तत्काल स्क्रॉल की आवश्यकता है , तो ध्यान दें कि यह अभी तक आबाद नहीं हो सकता है। इस मामले में आपको post()अपना setSelection()या उसके setSelectionAfterHeaderView()माध्यम से होना चाहिए Handlerताकि इसे बाद में कतार में बुलाया जाएगा।

listView.Handler.post(new Runnable() {
            @Override
            public void run() {
                listView.setSelectionAfterHeaderView();    
            }
        });

इसने मेरे लिए काम किया।


4

व्यक्तिगत रूप से, मैं आपको एक अलग यूआई पैटर्न खोजने की सलाह देता हूं। यह संभव है कि उपयोगकर्ता आपके वर्तमान "क्लिक" और सीटू में सूची में बदलाव को "सहज" समझेंगे, लेकिन मुझे संदेह है।

आप ListViewसुपरक्लास layoutChildren()को उप- श्रृंखला और ओवरराइडिंग की कोशिश कर सकते हैं , फिर setSelection(0)उस मामले में कॉल करें जहां इसकी आवश्यकता है। यदि केवल post()कॉल के कारण "काफी देरी" होती है , तो इसे स्पष्ट करना चाहिए।


4
सुझाव के लिए धन्यवाद, मैं इसे जल्द ही एक शॉट दूंगा। सूची को सीटू में बदल दिया गया है क्योंकि ब्रेडक्रंब को स्क्रीन पर कहीं और दिखाया गया है - विशिष्ट एंड्रॉइड यूआई डिज़ाइन मेरे विशिष्ट यूआई लक्ष्यों और लक्ष्य उपयोगकर्ताओं के लिए कम अनुकूल हैं। इसके अलावा, आपकी सभी मदद के लिए धन्यवाद - मैंने आपके ढेर सारे ढेरों जवाबों और आपके कॉमन्सवेयर साहित्य को पढ़ा है, और उन्होंने मुझे इस मंच पर आने में काफी मदद की है!
आकाश

यह ऐसा करने का तरीका है, कोई जादुई तरीका नहीं है, बस शुद्ध तर्क है। धन्यवाद!
लियो मोनिका सेलियो

2

एक वर्कअराउंड के रूप में, आप एक नया एडेप्टर बना सकते हैं जिसमें नया पुनर्जनन डेटा होता है, फिर ListView.setAdapter को कॉल करें। उसके बाद ListView.setSelection (n) पर कॉल करें।

btw, कॉमन्सवेयर द्वारा प्रदान किया गया समाधान काम किया है।


2

कुछ अलग आवश्यकता पर। अगर आप चैटिंग करते समय ही स्क्रॉल करना चाहते हैं।

        mListView.smoothScrollToPosition(mAdapter.getCount());

2

जब आप लिस्टव्यू हेडर से एडिटेक्स को फोकस करना चाहते हैं तो यह ठीक काम करता है

listview.setSelectionFromTop(0,0);

यदि आप सूची से विशेष सूचकांक दृश्य का चयन करना चाहते हैं

listview.setSelection(index); // o for top
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.