2012-09-19 17 views
5

मेरे पास एक ऐसा दृश्य है जिसमें एक सूची दृश्य है जो एक कर्सर एडाप्टर से जुड़ा हुआ है। कर्सर सामग्री परिवर्तन मैं अपने कस्टम कर्सर अनुकूलक में फिर शीर्ष पर ListView रखना चाहते हैं जब मैं कहा:एंड्रॉइड लिस्ट व्यू: स्क्रॉल करने के लिए काम नहीं करता

@Override 
protected void onContentChanged() { 
    // ... 
    myListView.scrollTo(0, 0); 
} 

लेकिन यह काम नहीं करता। फिर मैंने इस क्रिया को कतार में कहीं भी पढ़ा:

myListView.post(new Runnable() { 
    public void run() { 
     myListView.scrollTo(0, 0); 
    } 
}); 

लेकिन यह या तो काम नहीं करता है।

इसकी सामग्री बदलते समय मैं सूची दृश्य को शीर्ष पर कैसे रख सकता हूं?

संपादित करें:

बस कोशिश के लिए, मैं एक बटन और scrollTo (कहा जाता है) अपने onClickListener में जोड़ा गया है और यह काम नहीं किया! मैं क्या खो रहा हूँ ?

उत्तर

28

के बजाय scrollTo, (0) सूची दृश्य के शीर्ष स्थान प्राप्त करने के setSelection प्रयास करें।

+3

आईटी वर्क्स !! पर क्यों?? और क्यों स्क्रॉल करने के लिए काम नहीं करता है? – Alexis

+1

@jafar यह काम करना चाहिए। ListView की स्क्रॉल ListView पर स्वयं लागू होती है लेकिन सूचीदृश्य स्क्रॉल करने योग्य नहीं है, इसलिए परिणाम कुछ भी नहीं है। setSelection चाल करता है क्योंकि यह सूचीदृश्य के एडाप्टर – weakwire

+0

पर लागू होता है, अगर यह आपकी समस्या हल करता है तो कृपया उत्तर के रूप में चिह्नित करें ... धन्यवाद –

5

ListView के scrollTo एक View

setSelection(0) चाल है क्योंकि यह सूचीदृश्य के एडाप्टर

+0

यह भी ध्यान दें कि 'setSelection' को' adapter.notifyDataSetChanged() 'के बाद बुलाया जाना चाहिए। – TWiStErRob

5

मैं कार्यों कि सूचीदृश्य स्क्रॉल के लिए दूसरों के लिए उपयोगी हो सकता है बनाया पर लागू होता है, वे के लिए काम करता है के रूप में ListView यह स्वयं पर लागू होता है मुझे प्रत्येक एंड्रॉइड संस्करण, एमुलेटर और डिवाइस में, यहां आइटमहेइट सूचीदृश्य में दृश्य की निश्चित ऊंचाई है।

int itemheight=60; 
public void scrollToY(int position) 
{ 
    int item=(int)Math.floor(position/itemheight); 
    int scroll=(int) ((item*itemheight)-position); 
    this.setSelectionFromTop(item, scroll);// Important 
} 
public void scrollByY(int position) 
{ 
    position+=getListScrollY(); 
    int item=(int)Math.floor(position/itemheight); 
    int scroll=(int) ((item*itemheight)-position); 
    this.setSelectionFromTop(item, scroll);// Important 
} 
public int getListScrollY() 
{ 
    try{ 
    //int tempscroll=this.getFirstVisiblePosition()*itemheight;// Important 
    View v=this.getChildAt(0); 
    int tempscroll=(this.getFirstVisiblePosition()*itemheight)-v.getTop();// Important 
    return tempscroll; 
    }catch(Exception e){} 
    return 0; 
} 
+0

उपर्युक्त कार्यों को कक्षा में जोड़ा जाना चाहिए जो ListView – Diljeet

+0

विरासत/विस्तारित करता है हार्डकोडिंग ऊंचाई एक अच्छा विचार नहीं है, सूच मिश्रित तत्वों के साथ-साथ परिवर्तनीय ऊंचाई के साथ मल्टीलाइन टेक्स्ट को भी संभाल सकता है। इसके अलावा मैंने बहुत सारी फैंसी 'लिस्ट व्यू' लिखा है और न ही वास्तविक वर्ग को विस्तारित करने की जरूरत है। एडाप्टर से प्राप्त करने के बाद, किसी विशिष्ट आइटम की ऊंचाई के लिए 'View.measure (int, int) 'को कॉल करने पर विचार करें। – TWiStErRob

+0

आप सही हार्ड कोडिंग ऊंचाई सही दृष्टिकोण नहीं हैं, लेकिन आमतौर पर उपयोग किए गए सूचीदृश्यों ने ऊंचाई तत्वों को निर्धारित किया है, और स्क्रॉल फ़ंक्शंस उन पर काम नहीं करते हैं, यह केवल स्क्रॉल कार्यक्षमता के लिए एक काम है। आप उन्हें उनके अनुसार संशोधित कर सकते हैं, "View.measure (int, int)" इसका भी उपयोग किया जा सकता है, यह आपके ऊपर निर्भर करता है कि आप अपनी आवश्यकताओं के अनुरूप उन्हें कैसे संशोधित करेंगे। – Diljeet

संबंधित मुद्दे