Android – Виджет с прокручиваемым списком Manual Refresh

Я googled и нашел код для обработки данных listview с помощью 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); } } 

И написал все коды для получения данных из webservice в onCreate of WidgetViewsFactory реализует RemoteViewsService.RemoteViewsFactory

Для обновления записей вручную или автоматически каждые 5 секунд, я обнаружил, что «Обновить с помощью методов службы», как указано ниже

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

Как обновить список автоматически. Я знаю, как обновлять текст, как указано выше.

Вы можете обновить ListView с помощью метода notifyAppWidgetViewDataChanged () AppWidgetManager . Вам нужно будет получить экземпляр AppWidgetManager, получить AppWidgetIds и вызвать appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, viewId);

Псевдокод,

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

Когда вы вызываете notifyAppWidgetViewDataChanged() onDataSetChanged() метод onDataSetChanged() RemoteViewsFactory , который служит в качестве адаптера для вашего ListView. Вы можете использовать материал веб-сервиса и другие операции в onDataSetChanged() , получить ответ и добавить его в свой набор данных, который может быть ArrayList или любая такая коллекция.

Для дальнейших чтений / справок вы можете проверить информацию о хранении коллекции данных в документах. Также вы можете проверить демонстрационный пример из моего github .