2010-05-26 13 views
9

मैंने एडाप्टर क्लास के लिए सेक्शन इंडेक्सर लागू किया है जो बेसएडाप्टर को बढ़ाता है। अब पहली लॉन्च के लिए सेक्शन इंडेक्सर ओवरले सही तरीके से दिखा रहा है। लेकिन जब सूची की सामग्री अपडेट हो जाती है तो अनुभाग ओवरले अपडेट नहीं होता है और ArrayOutOfBoundException देता है। एक फिक्स के लिए मैंने क्या किया है मैंने listview.setFastScrollEnabled (false) बनाया है; एडाप्टर सामग्री अद्यतन करें; और फिर listview.setFastScrollEnabled (सत्य); अब क्या होता है ओवरले अपडेट हो जाता है लेकिन ओवरले सूचीदृश्य के बाएं शीर्ष पर आ रहा है। मैं इसे कैसे ठीक करूं।सेक्शन इंडेक्सर ओवरले अपडेट नहीं हो रहा है क्योंकि एडाप्टर के डेटा में बदलाव

+0

अभी तक एक ही समस्या, कोई समाधान नहीं मिला है - एंड्रॉयड 1.5 – tomash

+0

मैं एक बग भर दिया 9054 http://code.google.com/p/android/issues/detail?id=9054 – tomash

उत्तर

1

एक छोटे से वैकल्पिक हल जो lee.wilmot द्वारा सुझाव दिया गया था

private void jiggleGrid() { 

      int newWidth = flag(FLAG_THUMB_PLUS) ? 
FrameLayout.LayoutParams.FILL_PARENT : 
        grid.getWidth() - 1; 

      FrameLayout.LayoutParams l = new FrameLayout.LayoutParams(
          newWidth, 
          FrameLayout.LayoutParams.FILL_PARENT 
     ); 

      grid.setLayoutParams(l); 

      toggleFlag(FLAG_THUMB_PLUS); 
    } 

झंडा है और toggleFlag कुछ कार्य हैं।

setFastScrollEnabled(true); सेट करने के बाद इस विधि को कॉल करें। यह मेरे लिए काम किया ....

+0

आप कृपया क्या दिखा सकता है आपके लेआउट की तरह दिखता है? मेरा मतलब एक्सएमएल परिभाषा है। कामकाज मेरे लिए काम नहीं करता है। – tomash

+0

FLAG_THUMB_PLUS क्या है – cV2

+0

जानने के लिए वास्तव में बहुत अच्छा होगा यह चौड़ाई FILL_PARENT पर सेट होने पर काम नहीं करती है। यदि आप इसे कार्यान्वित करते हैं, और फिर कहते हैं, अभिविन्यास बदलें, चौड़ाई गलत तरीके से सेट है। –

8

सोचा मैं एक ListActivity के लिए ऊपर वैकल्पिक हल के एक रेडीमेड संस्करण का हिस्सा चाहते हैं: मेरे लिए

private boolean FLAG_THUMB_PLUS = false; 
private void jiggleWidth() { 

    ListView view = getListView(); 
    if (view.getWidth() <= 0) 
     return; 

    int newWidth = FLAG_THUMB_PLUS ? view.getWidth() - 1 : view.getWidth() + 1; 
    ViewGroup.LayoutParams params = view.getLayoutParams(); 
    params.width = newWidth; 
    view.setLayoutParams(params); 

    FLAG_THUMB_PLUS = !FLAG_THUMB_PLUS; 
} 

काम करता है।

+0

धन्यवाद धन्यवाद धन्यवाद :) – cV2

+0

यदि चौड़ाई FILL_PARENT पर सेट की गई है तो यह समाधान काम नहीं करता है। यदि आप इसे कार्यान्वित करते हैं, और फिर कहते हैं, अभिविन्यास बदलें, चौड़ाई गलत तरीके से सेट है। –

+0

lifesaver। धन्यवाद – kevinl

0

ऊपर दिए गए समाधान ठीक हैं जब चौड़ाई FILL_PARENT पर सेट की जाती है। उन्हें इस मामले के लिए काम करने के लिए आप इस

@Override 
protected void onSizeChanged (int w, int h, int oldw, int oldh) 
{ 
    super.onSizeChanged(w , h , oldw , oldh); 
    if (mInstance.getLayoutParams().width != FrameLayout.LayoutParams.FILL_PARENT) 
    { 
     mInstance.post(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       mInstance.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT , FrameLayout.LayoutParams.FILL_PARENT)); 
      } 
     }); 
    } 
} 
इस संशोधन के आकार के साथ

तरह onSizeChanged ओवरराइड स्क्रीन अभिविन्यास बदलने के बाद ठीक हो जाएगा चाहिए।

5

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

class MyListView extends ListView { 
    public MyListView(Context context) { 
     super(context); 
    } 

    public void invalidateSectionIndexer() { 
     // 1. this invalidates the Section Indexer 
     super.setFastScrollEnabled(false); 
     // Your adapter might be wrapped, e.g. when adding headers/footers. 
     ListAdapter adapter = getAdapter(); 
     BaseAdapter baseAdapter = (adapter instanceof WrapperListAdapter) ? 
       (BaseAdapter) ((WrapperListAdapter) adapter).getWrappedAdapter() : 
       (BaseAdapter) adapter; 
     baseAdapter.notifyDataSetChanged(); 
     super.setFastScrollEnabled(true); 

     // 2. This fixes the android bug of section overlay not positioned correctly. 
     int width = getWidth(); 
     int height = getHeight(); 
     super.onSizeChanged(width, height, width, height); 
    } 
} 
0

मैं ResourceCursorAdapter का उपयोग कर समान समस्या मिला है। सूची के लिए नए एडाप्टर सेट किए जाने के बाद सेक्शन इंडेक्सर अपडेट नहीं हो रहा था या कर्सर को अपडेट करने के लिए swapCursor() विधि को कॉल किया गया था। मैंने बिना किसी सफलता के स्टैक ओवरव्लो पर पोस्ट किए गए सभी समाधानों का प्रयास किया। केवल मुझे काम करने वाला कामकाज यह है कि आपको उस खंड को अलग/संलग्न करने की आवश्यकता है जिसे आप अपडेट करना चाहते हैं (आपको को क्रिएटिव्यू() टुकड़ा करने की विधि है जहां आप अपना यूआई बनाते हैं) मेरे कर्सर को अपडेट करने के बाद (कर्सर एडाप्टर नहीं .. आप onrereView()) में एडाप्टर को अपडेट/सेट करने की आवश्यकता है। यह मेरे लिए काम किया। यहां कोड है जिसे मैं खंड को दोबारा जोड़ने के लिए उपयोग करता हूं।

fragmentManager.beginTransaction().detach(frag).attach(frag).commitAllowingStateLoss(); 

आप इसी सूची को हटाने की कोशिश भी कर सकते हैं लेआउट से देखें और इसे फिर से लेआउट में जोड़ें लेकिन मुझे इस दृष्टिकोण का उपयोग करके कुछ मुद्दों में शामिल किया गया।

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