2012-10-13 18 views
10

Ben googled ve RemoteViewsService ve RemoteViewsService.RemoteViewsFactory kullanarak işlemek için kod bulundu. Android - Kaydırılabilir Listview El ile Yenileme Kılavuzu Yenile

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); 
    } 
} 

içerir ve WidgetViewsFactory arasında onCreate içinde webcoder verilerini alırken için tüm kodları yazmış

aşağıdaki gibi uygular elle kayıtları güncellemek için RemoteViewsService.RemoteViewsFactory

veya otomatik olarak her 5 saniyede, aşağıdaki gibi Hizmet aracılığıyla Güncelleştirme yöntemleri bulundu:

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; 
     } 
    } 
} 

Liste görünümü otomatik olarak nasıl güncellenir .. Yukarıda belirtilen metin görünümünü nasıl güncelleyeceğimi biliyorum.

cevap

48

ListView, AppWidgetManager'un notifyAppWidgetViewDataChanged() yöntemini kullanarak güncelleştirebilirsiniz. Sen, AppWidgetIds ve çağrı appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, viewId);

Sözde Kod olsun, AppWidgetManager örneğini almak zorunda kalacak

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

sonra RemoteViewsFactory ait onDataSetChanged() yöntemi Adaptörü olarak işlev gördüğü adı verilecek notifyAppWidgetViewDataChanged() diyoruz

ListView için. Web hizmetlerini ve diğer işlemleri onDataSetChanged()'da yapabilir, yanıtı alabilir ve ArrayList veya herhangi bir Koleksiyon gibi veri setinize ekleyebilirsiniz.

Daha fazla okuma/referans için dokümanlardaki Keeping Collection Data Fresh bölümünü kontrol edebilirsiniz. Ayrıca bir demo örneğimi github'dan kontrol edebilirsiniz.

+4

Tnx genious. :) –

+1

Bu sitede birçok konuya baktıktan sonra ve hiçbiri benim için çalıştı (muhtemelen bir "Collection Widget'ı kullanıyorum çünkü), bu bir çekicilik gibi çalıştı! Çok teşekkür ederim! –

+1

, her bir düzeni yeniden düzenleyen ve liste görünümlerini güncellemeyen sendBroadcast() kullanıyordum. Yöntem notifyAppWidgetViewDataChanged sadece daha az pahalı hale getirerek ferahlatıcı ilgilenir. –