2012-10-13 15 views
10

मैं googled और RemoteViewsService और RemoteViewsService.RemoteViewsFactory का उपयोग कर सूचीदृश्य डेटा हेरफेर करने के लिए कोड मिला। रूपएंड्रॉयड - स्क्रॉल सूची दृश्य मैनुअल ताज़ा साथ विजेट

नीचे
Intent svcIntent = new Intent(context, WidgetService.class); 
svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetIds[i]); 
svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME))); 
RemoteViews widget = new RemoteViews(context.getPackageName(),R.layout.widget_layout); 
widget.setRemoteAdapter(appWidgetIds[i], R.id.lstAppointments,svcIntent); 

WidgetService.java

public class WidgetService extends RemoteViewsService { 

    @Override 
    public RemoteViewsFactory onGetViewFactory(Intent intent) { 
     return (new WidgetViewsFactory(this.getApplicationContext(), intent)); 
    } 

    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return super.onBind(intent); 
    } 
} 

होता है और WidgetViewsFactory की onCreate में वेब सेवा से डेटा प्राप्त करने में सभी के लिए कोड लिखा लागू करता RemoteViewsService.RemoteViewsFactory

रिकॉर्ड मैन्युअल रूप से अद्यतन करने के लिए या स्वचालित रूप से प्रत्येक 5 सेकंड्स, मुझे नीचे दिए गए

01 के अनुसार सेवा विधियों के माध्यम से अपडेट मिला
public class WordWidget extends AppWidgetProvider { 

    static int value = 1; 
    Handler handler = new Handler(); 
    MyRunnable myRunnable; 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
      int[] appWidgetIds) { 
     // To prevent any ANR timeouts, we perform the update in a service 
     myRunnable = new MyRunnable(context); 
     handler.postDelayed(myRunnable, 1000); 
    } 

    class MyRunnable implements Runnable { 

     Context context; 

     public MyRunnable(Context context) { 
      this.context = context; 
     } 

     public void run() { 
      context.startService(new Intent(context, UpdateService.class)); 
      handler.postDelayed(myRunnable, 1000); 
     } 
    } 

    public static class UpdateService extends Service { 
     @Override 
     public void onStart(Intent intent, int startId) { 
      // Build the widget update for today 
      RemoteViews updateViews = buildUpdate(this); 

      // Push update for this widget to the home screen 
      ComponentName thisWidget = new ComponentName(this, WordWidget.class); 
      AppWidgetManager manager = AppWidgetManager.getInstance(this); 
      manager.updateAppWidget(thisWidget, updateViews); 
     } 

     public RemoteViews buildUpdate(Context context) { 
      RemoteViews updateViews; 

      // Build an update that holds the updated widget contents 
      updateViews = new RemoteViews(context.getPackageName(), 
        R.layout.widget_word); 

      Log.e("value", String.valueOf(value)); 
      updateViews.setTextViewText(R.id.word_title, "Title"); 
      updateViews.setTextViewText(R.id.word_type, String.valueOf(value)); 
      updateViews.setTextViewText(R.id.definition, String.valueOf(value)); 

      value += 1; 

      // When user clicks on widget it opens www.google.com 
      Intent defineIntent = new Intent(Intent.ACTION_VIEW, 
        Uri.parse("https://www.google.co.in/")); 
      PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, 
        defineIntent, 0); 
      updateViews.setOnClickPendingIntent(R.id.widget, pendingIntent); 

      return updateViews; 
     } 

     @Override 
     public IBinder onBind(Intent intent) { 
      // We don't need to bind to this service 
      return null; 
     } 
    } 
} 

स्वचालित रूप से सूचीदृश्य अद्यतन करने के लिए कैसे .. मैं जैसा कि ऊपर उल्लेख TextView अपडेट करने का तरीका पता है।

उत्तर

48

आप AppWidgetManager की notifyAppWidgetViewDataChanged() विधि का उपयोग कर ListView अद्यतन कर सकते हैं। आप AppWidgetIds और कॉल appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, viewId);

छद्म कोड मिलता है, AppWidgetManager के कहने प्राप्त करना होगा,

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
int appWidgetIds[] = appWidgetManager.getAppWidgetIds(
          new ComponentName(context, WidgetProvider.class)); 
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.listview); 

जब आप notifyAppWidgetViewDataChanged() तो RemoteViewsFactory की onDataSetChanged() विधि है जो एक एडाप्टर के रूप में सेवारत है बुलाया जाएगा फोन आपकी सूची दृश्य के लिए। आप onDataSetChanged() में वेब-सेवा सामान और अन्य परिचालन कर सकते हैं, प्रतिक्रिया प्राप्त करें और इसे अपने डेटा-सेट में जोड़ें जो शायद ऐरेलिस्ट या ऐसा कोई संग्रह हो।

आगे रीडिंग के लिए/संदर्भ आप डॉक्स से Keeping Collection Data Fresh हिस्सा देख सकते हैं। इसके अलावा आप मेरे github से डेमो उदाहरण देख सकते हैं।

+4

Tnx genious। :) –

+1

इस साइट में कई धागे को देखने के बाद और कोई भी मेरे लिए काम किया (शायद इसलिए कि मैं एक "संग्रह विजेट" का उपयोग कर रहा), यह एक एक आकर्षण के रूप में काम! आपका बहुत बहुत धन्यवाद! –

+1

मैं sendBroadcast() का उपयोग कर रहा था जो बदले में प्रत्येक लेआउट को पुनर्निर्माण कर रहा था, और सूचीदृश्य अपडेट नहीं कर रहा था। विधि सूचित करें AppWidgetViewDataChanged केवल इसे कम महंगा बनाने के लिए ताज़ा करने का ख्याल रखता है। –

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