Я попытался изо всех сил следовать указателям на developer.android.com, но это не сработало. Я занимаюсь этим последние пару дней с нулевым прогрессом. Я знаю, что у меня глупая ошибка, но я не могу понять. После непрерывного ведения журнала я понимаю, что ни один из методов не реализован в моей реализации RemoteViewsFactory, который (пытается) установить ListView в виджет с данными из курсора поставщика контента.Ни один из методов в RemoteViewsFactory не вызван вообще.
RemoteViewsFactory:
private Context context;
private int appWidgetId;
private Cursor cursor;
public FootballScoreFactory(Context context, Intent intent){
this.context = context;
appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
}
@Override
public void onDataSetChanged() {
if(cursor != null){
cursor.close();
}
String[] date = new String[1];
Date filterDate = new Date(System.currentTimeMillis());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
date[0] = format.format(filterDate);
try {
cursor = context.getContentResolver().query(
Uri.parse([content uri here, tested, returns the data]),
null,
null,
date,
null
);
} catch (Exception e){
e.printStackTrace();
}
}
@Override
public RemoteViews getViewAt(int position) {
String leagueName, home, away, homeGoal, awayGoal;
leagueName = home = away = homeGoal = awayGoal = "";
if(cursor.moveToPosition(position)){
leagueName = cursor.getString(cursor.getColumnIndex(DatabaseContract.scores_table.LEAGUE_COL));
home = cursor.getString(cursor.getColumnIndex(DatabaseContract.scores_table.HOME_COL));
away = cursor.getString(cursor.getColumnIndex(DatabaseContract.scores_table.AWAY_COL));
homeGoal = String.valueOf(cursor.getInt(cursor.getColumnIndex(DatabaseContract.scores_table.HOME_GOALS_COL)));
awayGoal = String.valueOf(cursor.getInt(cursor.getColumnIndex(DatabaseContract.scores_table.AWAY_GOALS_COL)));
}
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_list_item);
rv.setTextViewText(R.id.league_name, leagueName);
rv.setTextViewText(R.id.home, home);
rv.setTextViewText(R.id.away, away);
rv.setTextViewText(R.id.home_score, homeGoal.contentEquals("-1")? "-" : homeGoal);
rv.setTextViewText(R.id.away_score, awayGoal.contentEquals("-1")? "-" : awayGoal);
return rv;
}
RemoteViewsService:
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new FootballScoreFactory(getApplicationContext(), intent);
}
AppWidgetProvider:
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// There may be multiple widgets active, so update all of them
for (int appWidgetId : appWidgetIds) {
Intent intent = new Intent(context, FootballScoreService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.football_score);
rv.setRemoteAdapter(appWidgetId, R.id.widget_list_view, intent);
rv.setEmptyView(R.id.widget_list_view, R.id.empty_view);
appWidgetManager.updateAppWidget(appWidgetId, rv);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
Любая помощь, как к тому, что мне нужно сделать, чтобы убедиться, что мнения будут обновлены бы здорово. Если это помогает, то rv.setEmptyView(...);
работает постоянно.
И самое большое горе, которое я получил в этом, когда я, хотя я НЕ привязывал взгляды в файле манифеста приложения, но похоже, что я это сделал. :(
<service android:name=".FootballScoreService"
android:permission="android.permission.BIND_REMOTEVIEWS" />
Спасибо заранее.