[英]How on force update on widget with ListView
I need help with my app widget. 我的应用小部件需要帮助。 I need force update on him from any activity.
任何活动我都需要对他进行武力更新。 Widget reflect list from app, and after I do some updates or deletes on list.
小部件会反映应用程序中的列表,并且在我对列表进行一些更新或删除之后。 I need to show in widget real data.
我需要在小部件中显示真实数据。 Please help, how can i force update of this widget from any app activity ?
请帮助,我如何从任何应用程序活动中强制更新此小部件?
AppWidgetProvider AppWidgetProvider
public class Widget extends AppWidgetProvider {
...
@Override
public void onReceive(Context context, Intent intent) {
AppWidgetManager mgr = AppWidgetManager.getInstance(context);
if (intent.getAction().equals(TOAST_ACTION)) {
int appWidgetId = intent.getIntExtra(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
String id = intent.getStringExtra(EXTRA_ITEM);
Intent uIntent = new Intent(context, UlohaShowerActivity.class);
uIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
uIntent.putExtra(UlohaShowerActivity.ODOSLI, id);
context.startActivity(uIntent);
}
super.onReceive(context, intent);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
final int N = appWidgetIds.length;
for (int i = 0; i < N; ++i) {
RemoteViews remoteViews = updateWidgetListView(context,
appWidgetIds[i]);
appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
private RemoteViews updateWidgetListView(Context context, int appWidgetId) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.widget_uloha_layout);
Intent intent = new Intent(context, UlohaPridajActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
intent, 0);
remoteViews.setOnClickPendingIntent(R.id.widgetUlohaAdd, pendingIntent);
Intent svcIntent = new Intent(context, WidgetService.class);
svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));
remoteViews.setRemoteAdapter(appWidgetId, R.id.listUloha_w, svcIntent);
remoteViews.setEmptyView(R.id.listUloha_w, R.id.empty_view);
Intent toastIntent = new Intent(context, Widget.class);
toastIntent.setAction(Widget.TOAST_ACTION);
toastIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
PendingIntent toastPendingIntent = PendingIntent.getBroadcast(context, 0, toastIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setPendingIntentTemplate(R.id.listUloha_w, toastPendingIntent);
return remoteViews;
}
}
RemoteViewsFactory 远程视图工厂
public class ListProvider implements RemoteViewsFactory {
....
public ListProvider(Context context, Intent intent) {
this.context = context;
appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
populateListItem();
}
...
@Override
public RemoteViews getViewAt(int position) {
final RemoteViews remoteView = new RemoteViews(
context.getPackageName(), R.layout.uloha_list_row);
ListItem listItem = listItemList.get(position);
remoteView.setTextViewText(R.id.nazov, listItem.nazov);
remoteView.setTextViewText(R.id.datum, listItem.datum);
remoteView.setTextViewText(R.id.cas, listItem.cas);
Bundle extras = new Bundle();
extras.putString(Widget.EXTRA_ITEM, listItem.id);
Intent fillInIntent = new Intent();
fillInIntent.putExtras(extras);
remoteView.setOnClickFillInIntent(R.id.uloha_list_row, fillInIntent);
try {
System.out.println("Loading view " + position);
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return remoteView;
}
...
}
WidgetService WidgetService
public class WidgetService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
int appWidgetId = intent.getIntExtra(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
return (new ListProvider(this.getApplicationContext(), intent));
}
}
I found solution for simmilar problem by creating static method of appWidgetProvider for updating widgets views. 通过创建用于更新小部件视图的appWidgetProvider的静态方法,我找到了类似问题的解决方案。 This method can be called by system from original onUpdate method, or you can call this method from whenever you want:
系统可以从原始的onUpdate方法中调用此方法,也可以在任何需要的时候调用此方法:
private static int[] savedAppWidgetIds;
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
savedAppWidgedIds = appWidgetIds;
MyAppWidgetProvider.onUpdateMyView(context);
}
public static void onUpdateMyView(Context context) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_uloha_layout);
for (int i = 0; i < savedAppWidgetIds.size; i++) {
int appWidgetId = savedAppWidgetIds[i];
// update your widget,
Then u can call onUpdateMyWidget() method from everywhere by: 然后,您可以通过以下任何一种方法从任何地方调用onUpdateMyWidget()方法:
MyAppWidgetProvider.onUpdateMyView(context);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.