सूची को अद्यतन करने के बाद सूची के अंत तक स्क्रॉल करें


292

मैं यह सुनिश्चित करना चाहूंगा कि सूची में एडॉप्टर का उपयोग करके सूची को अपडेट करने के बाद सूची को नीचे तक सभी तरह से स्क्रॉल किया जाए, ताकि यह सूची में दर्ज अंतिम तत्व को प्रदर्शित करे। मैं यह कैसे कर सकता हूँ ?

मैंने यह कोशिश की लेकिन कोई किस्मत नहीं:

lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

धन्यवाद


यह करने की कोशिश करें कि यह काम करता है ... messagesListView.setTranscriptMode (ListView.TRANSCRIPT_MODE_NORMAL); messagesListView.setStackFromBottom (सही);
सुपरदेव

lv.setTranscriptMode (ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL) केवल यह सुनिश्चित करता है कि लिस्ट देखने के बाद एडॉप्टर को स्क्रॉल किया जाएगा। यदि यह काम नहीं कर रहा है, तो इस संपत्ति को xml में परिभाषित करने का प्रयास करें जैसा कि आप नीचे पोस्टों में देख सकते हैं।
टोम

जवाबों:


418

यह मानते हुए कि जब सूची डेटा बदल गया है, तो आप सूची को अंतिम पंक्ति में सूची चयन को सेट करके नीचे स्क्रॉल करने के लिए मैन्युअल रूप से बता सकते हैं। कुछ इस तरह:

private void scrollMyListViewToBottom() {
    myListView.post(new Runnable() {
        @Override
        public void run() {
            // Select the last row so it will scroll into view...
            myListView.setSelection(myListAdapter.getCount() - 1);
        }
    });
}

@ भूपेंद्र जो जरूरी नहीं है। आप थ्रेड के बिना भी कर सकते हैं, जैसा कि वार्टिंग के उत्तर में दिखाया गया है।
सागरपाटीदार

2
@ भूपेंद्र सेटसेलेक्शन () यूआई को अपडेट करता है। दृश्य पर पोस्ट (Runnable) को कॉल करके, आप Android UI थ्रेड पर Runnable कोड चलाया जाता है। आम तौर पर इसे इस तरह से करते हैं जब तक कि आप नहीं जानते कि आप पहले से ही यूआई थ्रेड पर हैं, या यह सुनिश्चित कर रहे हैं कि कुछ अन्य तरीकों से।
मेसन ली

5
यह भी लगता है कि एक नए सेट एडॉप्टर पर पोस्ट का उपयोग करने से स्क्रॉल एनीमेशन का कारण बनता है, जबकि मुख्य थ्रेड में होना सुनिश्चित करता है और एडेप्टर का उपयोग करने के तुरंत बाद कोई स्क्रॉल एनीमेशन का कारण बनता है
जियानलुका पी।

1
@SaifHamed के रूप में मेसन ली द्वारा केविन के जवाब पर टिप्पणी की गई है, इससे शॉर्ट लिस्ट में नीचे की बजाय व्यू के शीर्ष पर "खाली" स्थान होता है जो कि सबसे अधिक संभावित व्यवहार नहीं है।
दशहुंड १15

16
आप myListView.smoothScrollToPosition (myListAdapter.getCount () - 1) का भी उपयोग कर सकते हैं; चिकनी स्क्रॉलिंग के लिए
ज़ार ई अहमर

238

आपको अपनी सूची दृश्य में इन मापदंडों का उपयोग करने की आवश्यकता है:

  • स्क्रॉल lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

  • सूची के प्रमुख को इसके नीचे सेट करें lv.setStackFromBottom(true);

आप इन मापदंडों को XML में भी सेट कर सकते हैं, जैसे। इस तरह:

<ListView
   ...
   android:transcriptMode="alwaysScroll"
   android:stackFromBottom="true" />

27
ध्यान दें कि इस दृष्टिकोण के साथ, पंक्तियों को "नीचे से स्टैक" के रूप में वे जोड़ा जाता है। इसका मतलब है कि छोटी सूचियों में नीचे के बजाय दृश्य के शीर्ष पर "खाली" स्थान होगा, जो हमेशा वह नहीं होता जो कोई चाहता है।
मेसन ली

2
त्वरित सवाल: किसी भी तरह से मैं एनिमेटेड होने के लिए स्क्रॉल कर सकता हूं? वर्तमान में जब मैं NotDataSetChanged () यह कोई एनीमेशन के साथ कूदता है कारण!
जॉर्ज

@Georg क्या आपने अपने डिवाइस पर डेवलपर विकल्पों में शायद एनिमेशन को अक्षम कर दिया है?
जोनासकज - मोनिका

35

TRANSCRIPT_MODE_ALWAYS_SCROLL और सेटस्लेक्शन के संयोजन ने मेरे लिए काम किया

ChatAdapter adapter = new ChatAdapter(this);

ListView lv = (ListView) findViewById(R.id.chatList);
lv.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
lv.setAdapter(adapter);

adapter.registerDataSetObserver(new DataSetObserver() {
    @Override
    public void onChanged() {
        super.onChanged();
        lv.setSelection(adapter.getCount() - 1);    
    }
});

29

मुझे बटन क्लिक के जवाब में इसका उपयोग करने में सफलता मिली है, इसलिए मुझे लगता है कि आप अपनी सामग्री को अपडेट करने के बाद भी इसका उपयोग कर सकते हैं:

myListView.smoothScrollToPosition(theListAdapter.getCount() -1);

1
यह एक बेहतरीन उपाय है। सरल, एक पंक्ति।
जोश लार्सन

12

एक ListFragment में इसे पाने के लिए:

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); 
getListView().setStackFromBottom(true);`

इस उत्तर को जोड़ा क्योंकि अगर कोई एक ही समस्या के लिए Google खोज करता है ListFragment के साथ वह सिर्फ यह पाता है ..

सादर


9

उपयोग करना: सूची के प्रमुख को नीचे तक सेट करें lv.setStackFromBottom(true);

मेरे लिए काम किया है और सूची नीचे की ओर स्वचालित रूप से स्क्रॉल की जाती है जब इसे पहली बार दृश्यता में लाया जाता है। सूची तब स्क्रॉल करती है, जैसा उसे होना चाहिए TRANSCRIPT_MODE_ALWAYS_SCROLL


6
ध्यान दें कि इस दृष्टिकोण के साथ, पंक्तियों को "नीचे से स्टैक" के रूप में वे जोड़ा जाता है। इसका मतलब यह है कि छोटी सूचियों में नीचे के बजाय दृश्य के शीर्ष पर "खाली" स्थान होगा।
मेसन ली

5

मैं उपयोग करता हूं

setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);

तल पर प्रविष्टियाँ जोड़ने के लिए, और पुरानी प्रविष्टियाँ चैट ट्रांसक्रिप्ट की तरह शीर्ष पर स्क्रॉल करती हैं


getListView().smoothScrollToPosition(getListAdapter.getCount() - 1);गतिविधि की शुरुआत में नीचे की ओर स्क्रॉल करने के लिए ऑनस्टार्ट में कॉल करें।
पालिंड्रोम

4

सबसे सरल उपाय है:

    listView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
    listView.setStackFromBottom(true);

3

ट्रांसक्रिप्ट मोड वह है जो आप चाहते हैं और इसका उपयोग Google टॉक और एसएमएस / एमएमएस एप्लिकेशन द्वारा किया जाता है। जब आप आइटम जोड़ते हैं तो क्या आप अपने एडॉप्टर पर InformDatasetChanged () को सही ढंग से कॉल कर रहे हैं?


हां मैं हूं। सूची सही ढंग से अद्यतन हो जाती है, लेकिन हमेशा ऊपर से शुरू होती है। मुझे बस नई वस्तु जोड़ने और सूची के अंत तक स्क्रॉल करने की आवश्यकता है।
jramirez

ट्रांसक्रिप्ट मोड वास्तव में एसएमएस ऐप द्वारा अक्षम है। मुझे याद नहीं है कि वास्तव में क्यों।
टिम्मम्म
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.