2012-07-05 8 views
11

मेरे पास एक एपविजेट है जो ListView का उपयोग करता है। मैं एक वर्ग है कि फैली बनाया है RemoteViewsService:onGetViewFactory केवल एक बार कई विजेट्स के लिए बुलाया जाता है

public class AppWidgetService extends RemoteViewsService { 
    @Override 
    public RemoteViewsFactory onGetViewFactory(Intent intent) { 
     return (new AppWidgetListFactory(this.getApplicationContext(), intent)); 
    } 
} 

मेरे AppWidgetProvider, मैं विजेट के प्रत्येक उदाहरण (प्रत्येक appWidgetId के लिए) के लिए निम्न विधि फोन:

private static void fillInList(RemoteViews widget, Context context, int appWidgetId) { 
    Intent intent = new Intent(context, AppWidgetService.class); 
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
    widget.setRemoteAdapter(R.id.appwidget_listview, intent); 
} 

AppWidgetListFactory के निर्माता

public AppWidgetListFactory(Context context, Intent intent) { 
    this.context = context; 
    appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 

    System.out.println("New TVAPWLF for: " + appWidgetId); 
    trains = WidgetData.getInstance().widgetMap.get(appWidgetId); 
} 

अब समस्या यह है कि fillInList विधि को जितनी बार विजेट के उदाहरण कहा जाता है, लेकिन onGetViewFactory विधि केवल एक बार बुलाया जाता है। इसके परिणामस्वरूप सभी विजेट्स एक ही डेटा दिखाते हैं।

मैं इसे कैसे ठीक कर सकता हूं?

+0

क्या आप कुछ और कोड जोड़ सकते हैं? यदि आप 'fillInList' विधि को स्थिर बनाते हैं तो यह काम करता है? – Ronnie

+0

मेरे मामले में इरादा .putExtra काम करता है। प्रत्येक उदाहरण मुझे सही आवश्यक विजेट आईडी मिलती है। –

उत्तर

24

मैंने इसे स्वयं परीक्षण नहीं किया है, लेकिन RemoteViewsService.onBind() के लिए स्रोत कोड को देखकर, मुझे विश्वास है कि आप अपने इरादे में एक्स्ट्रा को अलग नहीं कर सकते हैं ताकि यह पता चल सके कि आपके onGetViewFactory() विधि के लिए एक नई कॉल की आवश्यकता है यह तुलना के लिए Intent.filterEquals() विधि का उपयोग करता है:

निर्धारित करें कि इरादे संकल्प (फ़िल्टरिंग) के प्रयोजनों के लिए दो इराद समान हैं या नहीं। यही है, अगर उनकी कार्रवाई, डेटा, प्रकार, वर्ग, और श्रेणियां समान हैं। यह इरादों में शामिल किसी भी अतिरिक्त डेटा की तुलना नहीं करता है।

मैं बजाय जानकारी है कि आप की जरूरत (विजेट आईडी?) आशय के डेटा के माध्यम से गुजर, हो सकता है कुछ की तरह सुझाव है:

private static void fillInList(RemoteViews widget, Context context, int appWidgetId) { 
    Intent intent = new Intent(context, AppWidgetService.class); 
    intent.setData(Uri.fromParts("content", String.valueOf(appWidgetId), null)); 
    widget.setRemoteAdapter(R.id.appwidget_listview, intent); 
} 

और क्रमशः प्राप्त पक्ष पर:

public TreinVerkeerAppWidgetListFactory(Context context, Intent intent) { 
    this.context = context; 
    appWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart()); 

    System.out.println("New TVAPWLF for: " + appWidgetId); 
    trains = WidgetData.getInstance().widgetMap.get(appWidgetId); 
} 
+1

उसने वास्तव में चाल की, बहुत बहुत धन्यवाद! – nhaarman

+0

@ जो आप कृपया जांच सकते हैं कि यह मेरे कोड में कैसे करें, वास्तव में मैंने आपके द्वारा किए गए परिवर्तन किए हैं लेकिन अब यह दुर्घटनाग्रस्त हो गया है। यह मेरा कोड है http://pastie.org/7063960 और यह लॉगकैट है http://pastie.org/7063968 – AndroidDev

+0

@ अंशुमन मुझे आपकी पहली पास्टी पर लाइन 36 पर एक समस्या दिखाई देती है: 'String.valueOf (appWidgetIds)' । यहां 'appWidgetIds' एक पूर्णांक की बजाय एक सरणी है और यह इरादे में एक अमान्य यूआरआई उत्पन्न करता है ("2" के बजाय "[I @ 424b7d58" जैसा कुछ)। क्या आप 'String.valueOf (appWidgetIds [0]) लिखने के लिए लिख रहे थे? – Joe

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