मैं अपने एप्लिकेशन के लिए विजेट पर काम कर रहा हूं जो स्टैकव्यू पर आधारित है और कुछ आइटम प्रदर्शित करना चाहिए। उपयोगकर्ता क्रियाओं के कारण आइटमों की गणना अलग-अलग हो सकती है - मान लीजिए कि यह किसी प्रकार का पसंदीदा मेनू है। मैं 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 था इसलिए मुझे समझ में नहीं आता कि RemoteViewsFactory
getViewAt()
पर कॉल करता है जब getCount()
0 देता है। जहां तक मैं समझता हूं, RemoteViewFactory
एक सामान्य एडाप्टर की तरह है, इसलिए यह व्यवहार पूरी तरह से मुझे भ्रमित कर रहा है। तो शायद इसके बारे में मेरे सुझाव गलत हैं और मैं कुछ गलत कर रहा हूं?
अद्यतन
आज मैं कुछ जीयूआई बग को ठीक करने का प्रयास करते हुए ListView
बजाय StackView
उपयोग करने के लिए मेरी विजेट लेआउट बदल दिया है। और अब सब ठीक काम करता है। आगे के प्रयोग से पता चलता है कि AdapterViewFlipper
स्टैकव्यू के समान समस्या है। जहां तक मुझे समझा गया कि AdapterViewAnimator
वंशजों के साथ काम करने वाले कुछ पहलू हैं - क्या कोई मेरी धारणा की पुष्टि/खंडन कर सकता है?
मैं जानता हूँ कि यह बहुत पुराना है पर ठीक से एक दृश्य वापसी सुनिश्चित करें, लेकिन मैं पर चलने के लिए होता है एक ही मुद्दा। डेटा सेट अपडेट किया गया है, लेकिन किसी भी तरह रिमोट व्यूफैक्टरी "getCount" का पुराना मान उपयोग करता है। क्या आपको कुछ और मिला? – mdelolmo
@mdelolmo दुर्भाग्यवश मुझे इस मुद्दे के लिए समाधान नहीं मिला और मेरे विजेट को एकल आइटम प्रदर्शित करने और < and > बटन का उपयोग करके वस्तुओं के माध्यम से नेविगेट करने के लिए फिर से काम किया। – Viacheslav
नीचे दिए गए उत्तर ने मेरे लिए इस समस्या को हल किया। यह एक कामकाज है, लेकिन एक अच्छा है :) –