简体   繁体   English

如何使用ListView强制更新窗口小部件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM