2010-05-22 20 views
75

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

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

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

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

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

किसी भी मदद की बहुत सराहना की जाएगी।

धन्यवाद!

उत्तर

4

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

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

+4

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

+0

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

2

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

बीटीडब्ल्यू, कॉमन्सवेयर द्वारा प्रदान किया गया समाधान काम किया गया है।

120

कॉल listView.setSelectionAfterHeaderView(); शीर्ष पर

+59

यह वही है जो मैंने इसे कहा होगा। – markshiz

+0

मेरे लिए महान काम करें! –

+0

आकर्षण की तरह काम करते हुए आपने अपना दिन बचाया ... –

39

स्क्रॉल करने के लिए मैं बस मेरे लिए listview.setSelection(0);

वर्क्स ठीक का उपयोग करें।

97

मैं बहुत कोशिश की है, लेकिन यह भी मुझे

list.smoothScrollToPosition(0); 
+3

एफवाईआई: एपीआई 8+ – iTurki

+0

@iturki की आवश्यकता है: या यह सही है, उल्लेख करने के लिए धन्यवाद। – N20084753

+3

यह कमाल है। मुझे आश्चर्य है कि क्या आप स्क्रॉल की गति बदल सकते हैं। – theblang

5

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

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

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

1

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

 mListView.smoothScrollToPosition(mAdapter.getCount()); 
संबंधित मुद्दे