2013-10-15 5 views
9

मैं अपने एप्लिकेशन के लिए विजेट पर काम कर रहा हूं जो स्टैकव्यू पर आधारित है और कुछ आइटम प्रदर्शित करना चाहिए। उपयोगकर्ता क्रियाओं के कारण आइटमों की गणना अलग-अलग हो सकती है - मान लीजिए कि यह किसी प्रकार का पसंदीदा मेनू है। मैं StackView के लिए विचारों को उत्पन्न करने के RemoteViewsFactory वंशज को लागू किया है:रिमोट व्यूफैक्ट्री को getViewAt कहा जाता है जब खाली डेटासेट

public class StackRemoteViewsFactory implements RemoteViewsFactory { 

    private List<Item> data; 
    private Context context; 

    public StackRemoteViewsFactory(Context context) { 
     this.context = context; 
     data = new DAO(context).getFavouriteCards(); 
    } 

    @Override 
    public void onDataSetChanged() { 
     data = new DAO(context).getWidgetItems(); // refresh widget dataset 
    } 

    @Override 
    public int getCount() { 
      return data.size(); 
    } 

    @Override 
    public RemoteViews getViewAt(int position) { 
     Item item = data.get(position); 
     // this is my problem and will be explained below - 
     // here I'm getting IndexOutOfBoundsException, position = 0 

      ... 
    } 
    // I have omitted other methods to avoid verbosity 
} 

सभी पहले विजेट शुरू में अच्छी तरह से काम करता है - विजेट सफलतापूर्वक खाली दृश्य प्रदर्शित करता है और सब कुछ ठीक हो जाता है। मैं AppWidgetManager तुरंत सूचित करने के बाद मैं पसंदीदा में कुछ नए तत्व कहा:

AppWidgetManager widgetManager = AppWidgetManager.getInstance(getActivity()); 
ComponentName component = new ComponentName(getActivity(), MyWidgetProvider.class); 
int[] widgetIds = widgetManager.getAppWidgetIds(component); 
widgetManager.notifyAppWidgetViewDataChanged(widgetIds, R.id.widgets_stack); 

सभी इस बिंदु पर अच्छी तरह से है - डाटासेट सफलतापूर्वक बदल गया है और मैं विजेट पर मेरी पसंदीदा आइटम देखें। लेकिन जब मैं पसंदीदा से मेरी एक तत्व को हटा दें और पसंदीदा खाली (AppWidgetManager निश्चित रूप से अधिसूचित) मैं अपने getViewAtMethod में IndexOutOfBoundsException प्राप्त हो जाते हैं:

10-15 17:26:36.810: E/AndroidRuntime(30964): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 

सब मैं देख लिया है क्या onDataSetChanged() आग के बाद getCount() रिटर्न सबसे पहले - यह 0 था इसलिए मुझे समझ में नहीं आता कि RemoteViewsFactorygetViewAt() पर कॉल करता है जब getCount() 0 देता है। जहां तक ​​मैं समझता हूं, RemoteViewFactory एक सामान्य एडाप्टर की तरह है, इसलिए यह व्यवहार पूरी तरह से मुझे भ्रमित कर रहा है। तो शायद इसके बारे में मेरे सुझाव गलत हैं और मैं कुछ गलत कर रहा हूं?

अद्यतन
आज मैं कुछ जीयूआई बग को ठीक करने का प्रयास करते हुए ListView बजाय StackView उपयोग करने के लिए मेरी विजेट लेआउट बदल दिया है। और अब सब ठीक काम करता है। आगे के प्रयोग से पता चलता है कि AdapterViewFlipper स्टैकव्यू के समान समस्या है। जहां तक ​​मुझे समझा गया कि AdapterViewAnimator वंशजों के साथ काम करने वाले कुछ पहलू हैं - क्या कोई मेरी धारणा की पुष्टि/खंडन कर सकता है?

+1

मैं जानता हूँ कि यह बहुत पुराना है पर ठीक से एक दृश्य वापसी सुनिश्चित करें, लेकिन मैं पर चलने के लिए होता है एक ही मुद्दा। डेटा सेट अपडेट किया गया है, लेकिन किसी भी तरह रिमोट व्यूफैक्टरी "getCount" का पुराना मान उपयोग करता है। क्या आपको कुछ और मिला? – mdelolmo

+0

@mdelolmo दुर्भाग्यवश मुझे इस मुद्दे के लिए समाधान नहीं मिला और मेरे विजेट को एकल आइटम प्रदर्शित करने और < and > बटन का उपयोग करके वस्तुओं के माध्यम से नेविगेट करने के लिए फिर से काम किया। – Viacheslav

+0

नीचे दिए गए उत्तर ने मेरे लिए इस समस्या को हल किया। यह एक कामकाज है, लेकिन एक अच्छा है :) –

उत्तर

10

वही समस्या यहां। चूंकि समाधान अभी तक नहीं आ रहा है (एंड्रॉइड 4.4 यहां और यह अभी भी होता है), मुझे लगता है कि अब के लिए सबसे अच्छा समाधान मूल रूप से दुर्घटना से बचने के लिए एक कामकाज है। कुछ devs अभी के लिए यह "हैक" कॉल करेंगे ...

:

public RemoteViews getViewAt(int position) { 

    if (position >= getCount()) 
      return getLoadingView(); 
    } 
    //.... Rest of your normal configuration 
} 

आप getLoadingView()

+1

यह मेरे लिए काम किया। यह अब तक दुर्घटनाग्रस्त नहीं है (अब तक), और ऐसा लगता है कि इस मामले में सही छोड़ दिया गया है और "खाली" विजेट दृश्य दिखाएं, जो वही है जो मैं चाहता था। हालांकि, मुझे आश्चर्य है कि क्या यह केवल स्टैक व्यू के साथ एक मुद्दा है? – Nlinscott

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