我正在尝试为我的应用创建一个小部件,其中包含项目的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,并且数据存在 那么我现在该如何解决小部件的问题呢?
我发现了,但这是提供程序类中的布局名称