14

を使用する appwidget がありますListView。拡張するクラスを作成しました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メソッドが呼び出されるのは 1 回だけです。これにより、すべてのウィジェットに同じデータが表示されます。

どうすればこれを修正できますか?

4

2 に答える 2

34

私はこれを自分でテストしていませんが、のソースコードを見ると、メソッドのメソッドを使用するため、メソッドへの新しい呼び出しが必要でRemoteViewsService.onBind()あることを検出するために、インテントのエクストラを変更することはできないと思います比較:onGetViewFactory()Intent.filterEquals()

インテントの解決 (フィルタリング) のために、2 つのインテントが同じかどうかを判断します。つまり、アクション、データ、タイプ、クラス、およびカテゴリが同じである場合です。これは、インテントに含まれる余分なデータを比較しません。

必要な情報 (ウィジェット 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);
}
于 2012-07-08T22:34:34.933 に答える