Android ListView में प्रोग्राम को विशिष्ट स्थान पर स्क्रॉल करें


157

मैं प्रोग्रामेटिक रूप से किसी विशिष्ट स्थिति में स्क्रॉल कैसे कर सकता हूं ListView?

उदाहरण के लिए, मेरे पास एक है String[] {A,B,C,D....}, और मुझे ListViewअपने सूचकांक 21 के शीर्ष दृश्यमान आइटम को सेट करने की आवश्यकता है String[]



मेरा जवाब यहाँ देखें, stackoverflow.com/a/29345217/1881527
मेलबोर्न लोप्स

जवाबों:


386

एक प्रत्यक्ष स्क्रॉल के लिए:

getListView().setSelection(21);

एक चिकनी स्क्रॉल के लिए:

getListView().smoothScrollToPosition(21);

कूल, यह वही है जो मैं चाहता हूं!
जियासी

महान, बहुत उपयोगी है। मेरे समय की बचत होती है। धन्यवाद।
नेहा अग्रवाल

एक और अंतर: पहले एक सूची के बीच में स्थापित करने की कोशिश करता है।
विक्टर पिंटो

11
smoothScrollToPositionकाम नहीं कर रहा है, कोई सुझाव?
स्वीटविशर ish

1
@SweetWisher weet निष्पादन में देरी करने की कोशिश करते हैं, कुछ इस तरह है:listView.post(() -> listView.smoothScrollToPosition());
एंडी रेस

64

स्क्रॉल अवधि के साथ एक SmoothScroll के लिए:

getListView().smoothScrollToPositionFromTop(position,offset,duration);

पैरामीटर्स की
स्थिति ->
ऑफसेट करने के लिए स्क्रॉल करने की स्थिति ----> स्क्रॉल की
अवधि समाप्त होने पर दृश्य के शीर्ष से स्थिति के पिक्सेल में वांछित दूरी-> स्क्रॉल के लिए उपयोग करने के लिए मिलीसेकंड की संख्या।

नोट: एपीआई ११ से

हैंडलरएक्सप्लॉइट का जवाब था कि मैं क्या देख रहा था, लेकिन मेरी लिस्टव्यू काफी लंबी है और वर्णमाला के साथ भी है। फिर मैंने पाया कि एक ही फ़ंक्शन अन्य मापदंडों को भी ले सकता है :)


संपादित करें: (AFDs सुझाव से)

वर्तमान चयन की स्थिति के लिए:

int h1 = mListView.getHeight();
int h2 = listViewRow.getHeight();

mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration);  

ठीक काम करता है। अपने जवाब में सुधार करने के लिए, ऑफसेट पर वर्णित के रूप में गणना की जा सकती stackoverflow.com/questions/5540223/...
AFD

v.getHeight () क्या है?
Panache

@Panache v सूची की पंक्ति है
amalBit

मैं तुमसे प्यार करता हूँ
Joao Ferreira

10

अपने कोड को हैंडलर में इस प्रकार रखें,

public void timerDelayRunForScroll(long time) {
        Handler handler = new Handler(); 
        handler.postDelayed(new Runnable() {           
            public void run() {   
                try {
                    lstView.smoothScrollToPosition(YOUR_POSITION);
                } catch (Exception e) {}
            }
        }, time); 
    }

और फिर इस विधि को कॉल करें,

timerDelayRunForScroll(100);

चीयर्स !!!


7

मैंने OnGroupExpandListener को सेट किया है और onGroupExpand () को ओवरराइड करें:

और setSelectionFromTop () विधि का उपयोग करें जो चयनित आइटम को सेट करता है और सूची के शीर्ष किनारे से चयन y पिक्सेल को रखता है। (यदि टच मोड में है, तो आइटम का चयन नहीं किया जाएगा लेकिन यह अभी भी उचित रूप से तैनात रहेगा।) (एंड्रॉइड डॉक्स)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
    {

        @Override
        public void onGroupExpand(int groupPosition) {

            expList.setSelectionFromTop(groupPosition, 0);
            //your other code
        }
    });

मुझे lisview को स्क्रॉल करते समय एक और दृश्य को एक साथ स्क्रॉल करने की आवश्यकता है। स्क्रॉल करने के लिए सूची दृश्य पर setSelectionFromTop का उपयोग करना UI थ्रेड को ब्लॉक करता है जो किसी अन्य दृश्य की स्क्रॉलिंग को धीमा कर देता है। क्या आप कुछ सुझाव दे सकते हैं कि यह कैसे करना है?
विजयराज

7

Listviewपुस्तक डिफ़ॉल्ट रूप से शीर्ष करने के लिए तैनात किया जाएगा, लेकिन चाहते हैं स्क्रॉल करने के लिए करता है, तो दिखाई नहीं तो इस का उपयोग करें:

if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
            listView1.setSelection(position);

धन्यवाद @zalak मेरी समस्या को हल करें, आप ऊपर
उठें

5

यदि कोई व्यक्ति जीमेल ऐप जैसी समान कार्यक्षमता की तलाश में है,

सूची स्क्रॉल को डिफ़ॉल्ट रूप से शीर्ष पर स्थित किया जाएगा। संकेत के लिए धन्यवाद। amalBit। बस इसे घटाओ। बस।

 Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            int h1 = mDrawerList.getHeight();
            int h2 = header.getHeight();
            mDrawerList.smoothScrollToPosition(h2-h1);
        }
    }, 1000);

4

हैंडलिंग सूची व्यू स्क्रॉलिंग यूपी / डाउन का उपयोग करके

अगर किसी को बटन का उपयोग करके listView एक पंक्ति ऊपर / नीचे से निपटने में रुचि है। फिर।

public View.OnClickListener onChk = new View.OnClickListener() {
             public void onClick(View v) {

                 int index = list.getFirstVisiblePosition();
                 getListView().smoothScrollToPosition(index+1); // For increment. 

}
});

मैं आपको सिर्फ इसलिए वोट देता हूं क्योंकि आप केवल एक हैं जिन्होंने वर्तमान स्थिति को प्राप्त करने का एक रास्ता दिखाया है, लेकिन आपको उदाहरण में सुधार करना चाहिए।
१३:०४ पर पंचिज

4

यदि आप एक सूची में सीधे इच्छित स्थान पर कूदना चाहते हैं तो बस उपयोग करें

listView.setSelection (int स्थिति);

और यदि आप सूची में वांछित स्थान पर आसानी से कूदना चाहते हैं तो उपयोग करें

listView.smoothScrollToPosition (int स्थिति);


3

इसी से मेरा काम बना है। अमलबिट और मेलबोर्न लोप्स द्वारा उत्तरों का संयोजन

public void timerDelayRunForScroll(long time) {
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() {           
        public void run() {   
            try {
                  int h1 = mListView.getHeight();
                  int h2 = v.getHeight();

                  mListView.smoothScrollToPositionFromTop(YOUR_POSITION, h1/2 - h2/2, 500);  

            } catch (Exception e) {}
        }
    }, time); 
}

और फिर इस विधि को कॉल करें जैसे:

timerDelayRunForScroll(400);

1

इसकी आसान सूची-view.set चयन (आप पॉस); या जब आप गतिविधि शुरू करते हैं तो आप अपनी स्थिति को साझा कर सकते हैं


सब मैं करना चाहता था स्वचालित रूप से सूची के शीर्ष पर ले जाया गया, बिना किसी स्क्रॉलिंग एनीमेशन के ... यह पूरी तरह से उसके लिए काम किया
RH201

1

-अगर आप चाहते हैं कि सूची विशिष्ट स्थिति तक स्क्रॉल करें:

myListView.smoothScrollToPosition(i);

यदि आप myListView में किसी विशिष्ट आइटम की स्थिति प्राप्त करना चाहते हैं:

myListView.getItemAtPosition(i);

-इसके अलावा यह myListView.getVerticalScrollbarPosition(i);आपकी मदद कर सकता है।

शुभ लाभ :)


0

सूची के स्क्रॉल स्थिति को ठीक से परिभाषित करने के लिए आपको दो चीजों की आवश्यकता है:

वर्तमान सूची देखने के लिए स्क्रॉल स्थिति प्राप्त करें:

int firstVisiblePosition = listView.getFirstVisiblePosition(); 
int topEdge=listView.getChildAt(0).getTop(); //This gives how much the top view has been scrolled.

सूची दृश्य स्क्रॉल स्थिति सेट करने के लिए:

listView.setSelectionFromTop(firstVisiblePosition,0);
// Note the '-' sign for scrollTo.. 
listView.scrollTo(0,-topEdge);

-1

मैंने दो अलग-अलग बटन का उपयोग करके ऊपर और नीचे स्क्रॉल करने की अनुमति देने के लिए यह समाधान पाया।

जैसा कि @Nepster द्वारा सुझाया गया है, वर्तमान स्थिति को प्राप्त करने के लिए getFirstVanishPosition () और getLastVanishPosition () का उपयोग करके क्रमिक रूप से स्क्रॉल को कार्यान्वित करें।

final ListView lwresult = (ListView) findViewById(R.id.rds_rdi_mat_list);
    .....

        if (list.size() > 0) {
            ImageButton bnt = (ImageButton) findViewById(R.id.down_action);
            bnt.setVisibility(View.VISIBLE);
            bnt.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(lwresult.getLastVisiblePosition()<lwresult.getAdapter().getCount()){
                        lwresult.smoothScrollToPosition(lwresult.getLastVisiblePosition()+5);
                    }else{
                        lwresult.smoothScrollToPosition(lwresult.getAdapter().getCount());

                    }
                }
            });
            bnt = (ImageButton) findViewById(R.id.up_action);
            bnt.setVisibility(View.VISIBLE);

            bnt.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(lwresult.getFirstVisiblePosition()>0){
                        lwresult.smoothScrollToPosition(lwresult.getFirstVisiblePosition()-5);
                    }else{
                        lwresult.smoothScrollToPosition(0);
                    }

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