Заменить RemoteViewsFactory при получении широковещательной передачи в провайдере виджетов - PullRequest
0 голосов
/ 08 мая 2020

У меня есть приложение с виджетом, отображающим список. Я хочу обновить список на основе рецепта, который пользователь открывает в приложении.

Для этого сначала я отправляю широковещательную рассылку с дополнительным целым числом, когда активность открыта.

Затем в поставщике виджетов я устанавливаю удаленный адаптер с намерением, содержащим целое число, полученное из широковещательной передачи.

Теперь я ожидал бы, что новый RemoteViewsFactory будет создаваться каждый раз, чтобы я мог извлечь целое число из намерения и загрузите другой список на основе этого числа.

Проблема в том, что это происходит только тогда, когда приложение открывается впервые, каждый раз вызывается только onDataSetChanged () в MyWidgetRemoteViewsFactory, поэтому я не могу получить номер рецепта для правильного обновления данных . Список в виджете никогда не обновляется.

Как заставить виджет воссоздать RemoteViewsFactory? Основываясь на другом topi c в stackoverflow, я попытался передать null в appWidgetManager.updateAppWidget (appWidgetId1, null) - это не сработало.

MainListActivity. java - отправить широковещательную рассылку

@Override
public void onItemClickListener(int itemID) {

    Intent recipeIntent = new Intent(this, BakingWidgetProvider.class);
    recipeIntent.setAction(BakingWidgetProvider.UPDATE_WIDGET_RECIPE);
    recipeIntent.putExtra(StepsListActivity.EXTRA_RECIPE_ID, itemID);
    sendBroadcast(recipeIntent);

    Intent intent = new Intent(MainListActivity.this, StepsListActivity.class);
    intent.putExtra(StepsListActivity.EXTRA_RECIPE_ID, itemID);
    startActivity(intent);

}

BakingWidgetProvider. java - Получить широковещательную рассылку

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

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);


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

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

        int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
        int viewIndex = intent.getIntExtra(StepsListActivity.EXTRA_RECIPE_ID, 0);

        int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, BakingWidgetProvider.class));

        for (int appWidgetId1 : appWidgetIds) {
             //trying to pass null to clear the data ?
            appWidgetManager.updateAppWidget(appWidgetId1, null);
        }

        Intent intent2 = new Intent(context, MyWidgetRemoteViewsService.class);
        Bundle bundle = new Bundle();
        bundle.putInt(StepsListActivity.EXTRA_RECIPE_ID,viewIndex );
        intent2.putExtras(bundle);

        remoteViews.setRemoteAdapter(R.id.list_view, intent2);

        appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.list_view);

        //empty view
        remoteViews.setEmptyView(R.id.list_view, R.id.empty_view);

        for (int appWidgetId1 : appWidgetIds) {

           appWidgetManager.updateAppWidget(appWidgetId1, remoteViews);
        }

    }
    super.onReceive(context, intent);
}

MyWidgetRemoteViewsService. java - получить целое число из намерения для правильного обновления данных

public class MyWidgetRemoteViewsService extends RemoteViewsService {

private static final String MyOnClick = "myOnClickTag";

@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {

    return new MyWidgetRemoteViewsFactory(this.getApplicationContext(), intent);
}

class MyWidgetRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {

    List<Recipe> recipeList;
    private Context mContext;
    private int mRecipeOpen;

    public MyWidgetRemoteViewsFactory(Context context, Intent intent) {

        mRecipeOpen =  intent.getExtras().getInt(StepsListActivity.EXTRA_RECIPE_ID);
        mContext = context;

    }
    @Override
    public void onCreate() {
    }

    @Override
    public void onDataSetChanged() {
        recipeList = AppDatabase.getInstance(getApplicationContext()).recipeDao().getAll();
    }

    @Override
    public void onDestroy() {
    }

    @Override
    public int getCount() {
        return recipeList.get(mRecipeOpen).ingredients.size();
    }

    @Override
    public RemoteViews getViewAt(int position) {

        RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_list_item);

        rv.setTextViewText(R.id.quantity, recipeList.get(mRecipeOpen).ingredients.get(position).getQuantity());
        rv.setTextViewText(R.id.measurement, recipeList.get(mRecipeOpen).ingredients.get(position).getMeasure());
        rv.setTextViewText(R.id.ingredient, recipeList.get(mRecipeOpen).ingredients.get(position).getIngredient());

        return rv;
    }

    @Override
    public RemoteViews getLoadingView() {
        return null;
    }

    @Override
    public int getViewTypeCount() {
        return 1;
    }

    @Override
    public long getItemId(int position) {
        return position;

    }

    @Override
    public boolean hasStableIds() {
        return true;

    }

}

} ​​

1 Ответ

0 голосов
/ 10 мая 2020

В конце концов, мне пришлось изменить свой подход.

Я поместил MyWidgetRemoteViewsFactory в отдельный класс и расширил BroadcastReceiver. Здесь, в методе onReceive, я могу получить широковещательную рассылку с требуемым целым числом, отправленную из BakingWidgetProvider.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...