【问题标题】:How on force update on widget with ListView如何使用 ListView 强制更新小部件
【发布时间】:2014-08-26 15:54:55
【问题描述】:

我需要有关我的应用小部件的帮助。我需要从任何活动中对他进行强制更新。小部件反映来自应用程序的列表,以及在我对列表进行一些更新或删除之后。我需要在小部件中显示真实数据。请帮忙,我怎样才能从任何应用程序活动中强制更新这个小部件?

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

小部件服务

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

【问题讨论】:

    标签: android android-widget


    【解决方案1】:

    我通过创建 appWidgetProvider 的 static 方法来更新小部件视图,找到了类似问题的解决方案。系统可以从原始的 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, 
    

    然后你可以通过以下方式从任何地方调用 onUpdateMyWidget() 方法:

    MyAppWidgetProvider.onUpdateMyView(context);
    

    【讨论】:

    • 您可以在 onUpdate 方法中将 appWidgetIds 存储到 appWidgetProvider 的静态变量中,然后您就可以访问它了。检查我的更新代码..
    • 我做到了,我的小部件已更新,但 listview 加载了相同的旧值。
    • 然后将新列表视图的值或任何您需要的值保存到 appWidgetProvider 的静态变量中。
    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2015-05-10
    • 2022-01-16
    • 2021-08-06
    • 1970-01-01
    相关资源
    最近更新 更多