gridwidget不显示数据列表

时间:2018-10-26 18:33:48

标签: android

我正在尝试为我的应用创建一个小部件,其中包含项目的recyclerview 所以我为这些项目创建了一个小部件,如下所示:  这是我的提供者:

public class WidgetProvider extends AppWidgetProvider {

    static ArrayList<String> scheduleList = new ArrayList<>();

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {

        Intent intent = new Intent(context, MainActivity.class);
        intent.addCategory(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT|Intent.FLAG_ACTIVITY_SINGLE_TOP);

        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.schedule_widget);

        views.setPendingIntentTemplate(R.id.widget_grid_view, pendingIntent);

        Intent bakingIntent = new Intent(context, GridWidgetService.class);
        views.setRemoteAdapter(R.id.widget_grid_view, bakingIntent);

        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    }

    public static void updateBakingWidgets(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for (int appWidgetId : appWidgetIds) {
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }

    @Override
    public void onEnabled(Context context) {
        // Enter relevant functionality for when the first widget is created
    }

    @Override
    public void onDisabled(Context context) {
        // Enter relevant functionality for when the last widget is disabled
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, WidgetProvider.class));

        final String action = intent.getAction();

        if (action.equals("android.appwidget.action.APPWIDGET_UPDATE")) {
            scheduleList = intent.getExtras().getStringArrayList(SCHEDULES_LIST);
            appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.widget_grid_view);
            WidgetProvider.updateBakingWidgets(context, appWidgetManager, appWidgetIds);
            super.onReceive(context, intent);
        }
    }

}

这是GridWidgetService.java类:

public class GridWidgetService extends RemoteViewsService {
    List<String> remoteSchedulesList;

    @Override
    public RemoteViewsFactory onGetViewFactory(Intent intent) {
        return new GridRemoteViewsFactory(this.getApplicationContext(),intent);
    }


    class GridRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {

        Context mContext = null;

        public GridRemoteViewsFactory(Context context,Intent intent) {
            mContext = context;

        }

        @Override
        public void onCreate() {
        }

        @Override
        public void onDataSetChanged() {
            remoteSchedulesList = scheduleList;
        }

        @Override
        public void onDestroy() {

        }

        @Override
        public int getCount() {

            return remoteSchedulesList.size();
        }

        @Override
        public RemoteViews getViewAt(int position) {

            RemoteViews views = new RemoteViews(mContext.getPackageName(), R.layout.grid_widget_item);

            views.setTextViewText(R.id.widget_grid_view_item, remoteSchedulesList.get(position));

            Intent intent = new Intent();
            views.setOnClickFillInIntent(R.id.widget_grid_view_item, intent);

            return views;
        }

        @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;
        }

    }

}

最后是UpdateService.java类:

public class UpdateService extends IntentService {

    public static String SCHEDULES_LIST ="FROM_ACTIVITY_SCHEDULES_LIST";
    public static final String UPDATE_WIDGETS = "android.appwidget.action.APPWIDGET_UPDATE";

    public UpdateService() {
        super("UpdateService");
    }

    public static void startService(Context context, ArrayList<String> schedulesList) {
        Intent intent = new Intent(context, UpdateService.class);
        intent.putExtra(SCHEDULES_LIST, schedulesList);
        context.startService(intent);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if (intent != null) {
            ArrayList<String> schedulesList = intent.getExtras().getStringArrayList(SCHEDULES_LIST);
            handleActionUpdateWidgets(schedulesList);

        }
    }

    private void handleActionUpdateWidgets(ArrayList<String> schedulesList) {
        Intent intent = new Intent(UPDATE_WIDGETS);
        intent.setAction(UPDATE_WIDGETS);
        intent.putExtra(SCHEDULES_LIST, schedulesList);
        sendBroadcast(intent);
    }

}

然后在我调用API的MainActivity类中,我将数据同时添加到recycleview和小部件:

@Override
            public void onResponse(Call<SchedulesResponse> call, Response<SchedulesResponse> response) {
                int statusCode = response.code();
                List<Schedule> monday = response.body().getMonday();
                mondayRecyclerView.setAdapter(new MainAdapter(monday, R.layout.list_item_schedule, getApplicationContext(), MainActivity.this));

schedule = new ArrayList<>();

                ArrayList<String> scheduleListWidgets = new ArrayList<>();

                StringBuilder schedulesBuilder = new StringBuilder();
                for (Schedule s : monday) {
                    schedulesBuilder.append(s.getTitle() + "\n");

                    scheduleListWidgets.add(s.getTitle() + "\n");
                }

                UpdateService.startService(MainActivity.this, scheduleListWidgets);

            }

以及我用来添加接收方和服务的清单文件中:

<receiver android:name=".Widget.WidgetProvider">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/schedule_widget_info" />
        </receiver>

        <service android:name=".Widget.UpdateService" />

        <service
            android:name=".Widget.GridWidgetService"
            android:permission="android.permission.BIND_REMOTEVIEWS" />

,但实际上该小部件未显示数据,并且仅显示了textview的默认文本,我不知道为什么 我试图在MainActivity中调试schedulesBuilder,并且数据存在 那么我现在该如何解决小部件的问题呢?

我发现了,但这是提供程序类中的布局名称

0 个答案:

没有答案