2010-01-01 11 views
25

क्या कोई तरीका है कि मैं सुनिश्चित कर सकता हूं कि एंड्रॉइड सूचीदृश्य में दी गई वस्तु पूरी तरह से दिखाई दे?एंड्रॉइड सूचीदृश्य पर दृश्यमान सुनिश्चित करें?

मैं प्रोग्राम के लिए एक विशिष्ट आइटम पर स्क्रॉल करने में सक्षम होना चाहता हूं, जैसे कि जब मैं उदाहरण के लिए बटन दबाता हूं।

उत्तर

20

ListView.setSelection() सूची को स्क्रॉल करेगा ताकि वांछित आइटम व्यूपोर्ट के भीतर हो।

+4

सेटसेक्शन दृश्य के शीर्ष पर स्क्रॉल करता है। मुझे बस जितना संभव हो सके – CodeFusionMobile

+0

स्थानांतरित करने की आवश्यकता है यह उत्तर सटीक नहीं है, क्योंकि CodeFusionMobile ने बताया। इस प्रकार मैं वास्तव में इसे स्वीकार नहीं करता ... :-( – Zordid

11

यह प्रयास करें:

public static void ensureVisible(ListView listView, int pos) 
{ 
    if (listView == null) 
    { 
     return; 
    } 

    if(pos < 0 || pos >= listView.getCount()) 
    { 
     return; 
    } 

    int first = listView.getFirstVisiblePosition(); 
    int last = listView.getLastVisiblePosition(); 

    if (pos < first) 
    { 
     listView.setSelection(pos); 
     return; 
    } 

    if (pos >= last) 
    { 
     listView.setSelection(1 + pos - (last - first)); 
     return; 
    } 
} 
+6

listView.smoothScrollToPosition (pos); सेट चयन (...) के बजाय यदि आप चाहते हैं। धन्यवाद jauseg। – Saikat

+0

+1 इसके लिए धन्यवाद! – Olayinka

+0

हम्म। कम से कम एक pitfall यहां: यदि आप लेआउट से पहले चयन सेटअप करते हैं - कोई आखिरी दृश्य स्थिति नहीं होगी (= -1) और सबकुछ टूट जाएगा। आपको यह सुनिश्चित करने की ज़रूरत है कि लेआउट पूरा होने के बाद यह चल रहा है। अन्यथा यह करता है अपेक्षित काम नहीं करते हैं लेकिन चयन को पूरी तरह से गलत सेट करते हैं। – Zordid

5

मेरा मानना ​​है कि आप के लिए क्या देख रहे है ListView.setSelectionFromTop() (हालांकि मैं थोड़ा देर से पार्टी के लिए कर रहा हूँ)।

2

मेरे पास एक छोटा और है, मेरी राय में, ऐसा करने के लिए बेहतर समाधान: ListView requestChildRectangleOnScreen विधि इसके लिए डिज़ाइन की गई है।

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

private void ensureVisible(ListView parent, View view) { 
    Rect rect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); 
    parent.requestChildRectangleOnScreen(view, rect, false); 
} 
+7

यदि आप एपीआई 8 या बाद में उपयोग करते हैं, तो ListView smoothScrollToPosition() विधि भी बेहतर समाधान है। –

+0

Yves के साथ समस्या 'जवाब यह है कि यह' व्यू 'जरूरी नहीं है ... यदि यह दिखाई नहीं दे रहा है, तो' लिस्ट व्यू 'शायद इसे छोड़ देगा। वास्तव में,' smoothScrollToPosition' अच्छा है यहाँ nswer। – RedGlyph

3

हाल ही में मैं एक ही समस्या से मुलाकात की, मामले में किसी को इसकी जरूरत में यहां मेरे समाधान पेस्ट (मैं करने के लिए कोशिश कर रहा था पूरे अंतिम दृश्यमान वस्तु को दृश्यमान बनाएं):

if (mListView != null) { 
     int firstVisible = mListView.getFirstVisiblePosition() 
       - mListView.getHeaderViewsCount(); 
     int lastVisible = mListView.getLastVisiblePosition() 
       - mListView.getHeaderViewsCount(); 

     View child = mListView.getChildAt(lastVisible 
       - firstVisible); 
     int offset = child.getTop() + child.getMeasuredHeight() 
       - mListView.getMeasuredHeight(); 
     if (offset > 0) { 
      mListView.smoothScrollBy(offset, 200); 
     } 
    } 
+0

महान काम करता है! हालांकि मुझे एक एज केस का जिक्र करना चाहिए जिसके लिए कोड परिवर्तन की आवश्यकता है: आपको mListView.post (नया रननेबल() {सार्वजनिक शून्य रन() {(उपरोक्त कोड);})} कॉल करना होगा; यह उस मामले को संभालता है जहां आप अंतिम बच्चे की ऊंचाई को संशोधित कर रहे हैं (इस प्रकार ListView की सामग्री को लंबा बनाते हैं)। एक रननेबल पोस्ट करने से सूची सूची को नए सूची में स्क्रॉल करने का प्रयास करने से पहले खुद को अपडेट करने का मौका मिलता है। – foo64

+1

दुर्भाग्य से 'ListView.smoothScrollBy' स्क्रॉल करने वाली राशि के लिए एक आंतरिक कैप है। ऐसा इसलिए है क्योंकि आंतरिक रूप से यह उपयोगकर्ता फ़्लिंग को अनुकरण करता है। आइटमों के 10 स्क्रीन स्क्रॉल करने के लिए इस विधि का उपयोग केवल कुछ स्क्रीनों द्वारा स्क्रॉल करने के परिणामस्वरूप होता है। – foo64

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