【问题标题】:Android AppWidget update ListViewAndroid AppWidget更新ListView
【发布时间】:2017-02-21 18:25:20
【问题描述】:

我在使用 Android 上的 Appwidget 时遇到问题。我有一个 listView 和一个 Button,Widget 的更新周期设置为 30 分钟。 现在我想在单击按钮时更新 listView。我在互联网上搜索过这个问题,但我没有找到解决问题的答案。 在我的代码中,我必须在 onReceived() 方法中编写什么来更新小部件?

我的代码:

public class WidgetProvider extends AppWidgetProvider {

private static final String ACTION_UPDATE_CLICK = "click";

private Date date;

@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);
        remoteViews.setOnClickPendingIntent(R.id.bMorgenWidget,
                getPendingSelfIntent(context,
                        ACTION_UPDATE_CLICK));
    }

    super.onUpdate(context, appWidgetManager, appWidgetIds);
}


private PendingIntent getPendingSelfIntent(Context context, String action) {
    Intent intent = new Intent(context, getClass());
    intent.setAction(action);
    return PendingIntent.getBroadcast(context, 0, intent, 0);
}

@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);

    if (ACTION_UPDATE_CLICK.equals(intent.getAction())) {

    }
}

private RemoteViews updateWidgetListView(Context context, int appWidgetId) {

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
            R.layout.widget_layout);

    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.listViewWidget,
            svcIntent);
    remoteViews.setEmptyView(R.id.listViewWidget, R.id.empty_view);
    return remoteViews;
}
}

【问题讨论】:

    标签: android listview android-appwidget


    【解决方案1】:

    我遇到了同样的问题。我想知道如何强制更新小部件中的数据和 ui。

    我找到的解决方案是使用公共静态内部服务:

    /**
     * Update Big Widget Service
     */
    public static class WidgetBigUpdateService extends Service
    {
        public WidgetBigUpdateService()
        {
            super();
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId)
        {
            Context context = getBaseContext();
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
            int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, this.getClass()));
            RemoteViews bigWidgetView = new RemoteViews(context.getPackageName(), R.layout.widget_big_layout);
            refreshBigWidgetData(context, appWidgetManager, appWidgetIds, bigWidgetView);
            return super.onStartCommand(intent, flags, startId);
        }
    
        @Override
        public IBinder onBind(Intent intent)
        {
            return null;
        }
    }
    

    方法 refreshBigWidgetData(context, appWidgetManager, appWidgetIds, bigWidgetView); 属于widget,负责我的widget的UI更新:

    /**
     * Asks for Big Widget Updates
     *
     * @param context
     */
    private void widgetBigForceUpdate(Context context)
    {
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, this.getClass()));
        onUpdate(context, appWidgetManager, appWidgetIds);
    }
    

    如您所见,它使用上下文、appWidgetManager 和 appWidgetId 调用函数onUpdate()。此代码 100% 有效,我毫不怀疑您可以根据您的特定用途对其进行调整。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-09
      • 2011-10-20
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多