Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android appwidget listview未更新_Android_Listview_Widget_Android Appwidget - Fatal编程技术网

android appwidget listview未更新

android appwidget listview未更新,android,listview,widget,android-appwidget,Android,Listview,Widget,Android Appwidget,我已经编写了一个AppWidget,它在一个列表视图中显示来自ContentProvider的一些数据,但是我在更新它时遇到了麻烦。当我第一次创建小部件时,它被正确填充,但在AlarmManager的PendingEvent到达后,ListView上没有更新。代码如下: Intent update = new Intent(context, MenuWidgetProvider.class); update.setAction(AppWidgetManager.ACTION_APPWIDGET_

我已经编写了一个AppWidget,它在一个列表视图中显示来自ContentProvider的一些数据,但是我在更新它时遇到了麻烦。当我第一次创建小部件时,它被正确填充,但在AlarmManager的PendingEvent到达后,ListView上没有更新。代码如下:

Intent update = new Intent(context, MenuWidgetProvider.class);
update.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
update.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent pIUpdate = PendingIntent.getBroadcast(context, 0, update, 0);
((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).
set(AlarmManager.RTC, nextTime.toMillis(false), pIUpdate);

Log.d(TAG, "updating: " + dmt.mealName);

for (int i = 0; i < appWidgetIds.length; ++i) {
    int widgetId = appWidgetIds[i];

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_menu);
    // meal name
    views.setTextViewText(R.id.widget_locname, prefs.getString(PREF_WIDGET_LOCNAME, ""));

    // adapter
    Intent adapter = new Intent(context, MenuWidgetAdapterService.class);
    adapter.putExtra(EXTRA_LOCATIONID, prefs.getInt(PREF_WIDGET_LOCID, -1));
    adapter.putExtra(EXTRA_MEALNAME, dmt.mealName);
    adapter.putExtra(EXTRA_DATE, dmt.date.toString());
    views.setRemoteAdapter(R.id.widget_list, adapter);

    // update
    manager.updateAppWidget(widgetId, views);
}

super.onUpdate(context, manager, appWidgetIds);
Intent update=newintent(上下文,MenuWidgetProvider.class);
update.setAction(AppWidgetManager.ACTION\u APPWIDGET\u update);
update.putExtra(AppWidgetManager.EXTRA_APPWIDGET_id,appWidgetIds);
PendingEvent pIUpdate=PendingEvent.getBroadcast(上下文,0,更新,0);
((AlarmManager)context.getSystemService(context.ALARM_服务))。
set(AlarmManager.RTC、nextTime.toMillis(false)、pIUpdate);
Log.d(标记“更新:+dmt.mealName”);
对于(int i=0;i
奇怪的是,当更新发生时,onUpdate()方法运行——我看到Log.d调用的输出——但在我的RemoteViewsFactory中没有对onDataSetChanged()的调用。即使我调用notifyAppWidgetViewDataChanged,也没有效果。

即使我有同样的问题。 小部件的RemoteView存在此问题

解决方案:向自己发送广播并再次刷新列表。i、 将数据设置为完整视图,然后将广播发送给yopurself


希望这有帮助,这是因为您的RemoteViewsFactory会缓存它为每个小部件ID创建的工厂。因此,当同一小部件发送创建新工厂的请求(通过您的小部件适配器服务)时,会返回同一工厂。因此,列表视图不会“更新”

我是如何解决这个问题的:

在您的WidgetProviderClass中

adapter.setData(Uri.fromParts("content", String.valueOf(appWidgetIds[i]+randomNumber), null));
其中randomNumber是一个随机数(WidgetProvider类的公共静态成员)

然后在RemoteViewsFactory类中,执行以下操作:

appWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart())
            - WidgetProvider.randomNumber;
这“愚弄”了服务,使其认为它必须为另一个小部件创建一个工厂,因此,使用更新的值创建一个新工厂,并将其附加到您的小部件上

希望这有帮助。

试试动态数字

在WidgetProviderClass中:

int randomNumber=(int)(Math.random()*1000); 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId+randomNumber);

           intent.setData(Uri.fromParts("content", String.valueOf(appWidgetId), null));

           intent.putExtra("random",randomNumber );
           intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
           rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
在RemoteViewsFactory类中,执行以下操作:

AppWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart());

这种技术可以工作,但当我对小部件进行内存配置时,内存消耗会增加。为了调试/分析的目的,我每隔一分钟设置一次警报。这个问题把我逼疯了。你救了我一天。你是如何找到这个解决方案的;只是好奇。谢谢Prateek。请问这个解决方案的成本是多少?你是javatar!