android - onGetViewFactory 只为多个小部件调用一次

标签 android android-appwidget

我有一个使用 ListView 的 appwidget。 我创建了一个扩展 RemoteViewsService 的类:

public class AppWidgetService extends RemoteViewsService {
    @Override
    public RemoteViewsFactory onGetViewFactory(Intent intent) {
        return (new AppWidgetListFactory(this.getApplicationContext(), intent));
    }
}

在我的 AppWidgetProvider 中,我为小部件的每个实例(对于每个 appWidgetId)调用以下方法:

private static void fillInList(RemoteViews widget, Context context, int appWidgetId) {
    Intent intent = new Intent(context, AppWidgetService.class);
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
    widget.setRemoteAdapter(R.id.appwidget_listview, intent);
}

AppWidgetListFactory的构造函数

public AppWidgetListFactory(Context context, Intent intent) {
    this.context = context;
    appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);

    System.out.println("New TVAPWLF for: " + appWidgetId);
    trains = WidgetData.getInstance().widgetMap.get(appWidgetId);
}

现在的问题是,fillInList 方法的调用次数与小部件实例的调用次数一样多,但是 onGetViewFactory 方法只被调用一次。这会导致所有小部件显示相同的数据。

我该如何解决这个问题?

最佳答案

我自己还没有对此进行测试,但是查看 RemoteViewsService.onBind() 的源代码,我相信您不能仅仅改变 Intent 中的额外内容以使其检测到需要对 onGetViewFactory() 方法进行新调用,因为它使用 Intent.filterEquals() 方法进行比较:

Determine if two intents are the same for the purposes of intent resolution (filtering). That is, if their action, data, type, class, and categories are the same. This does not compare any extra data included in the intents.

我建议改为通过 Intent 的数据传递您需要的信息(小部件 ID?),可能是这样的:

private static void fillInList(RemoteViews widget, Context context, int appWidgetId) {
    Intent intent = new Intent(context, AppWidgetService.class);
    intent.setData(Uri.fromParts("content", String.valueOf(appWidgetId), null));
    widget.setRemoteAdapter(R.id.appwidget_listview, intent);
}

分别在接收端:

public TreinVerkeerAppWidgetListFactory(Context context, Intent intent) {
    this.context = context;
    appWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart());

    System.out.println("New TVAPWLF for: " + appWidgetId);
    trains = WidgetData.getInstance().widgetMap.get(appWidgetId);
}

关于android - onGetViewFactory 只为多个小部件调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11350287/

相关文章:

android - java.net.绑定(bind)异常 : bind failed: EACCES (Permission denied) on a rooted device

android - 添加后重新配置小部件

java - 无法使用 ArrayList<HashMap<String,?>>> 填充 listView

java - Android 从计时器任务启动 Activity

android - 如何像 Activity 一样在主屏幕小部件中使用按钮

xml - 错误 : resource android:dimen/system_app_widget_internal_padding not found

Android 小部件使用 putextra 开始新 Activity

android - 按钮没有出现在 android appwidget 布局中

android - 在 Firebase 项目中集成 gmail 连接

Android SDL2 在锁定屏幕上恢复