I'm trying to implement a simple collection widget for my application, i'm trying to show a ListView
inside a widget but the ListView
is stuck at Loading... and never finish loading, and i have data in the database and the listview is still stuck with it.
Here is the onUpdate
method from my AppWidgetProvider class:
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
int length = appWidgetIds.length;
for (int x = 0; x < length; x++){
RemoteViews remote = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
Intent intent = new Intent(context,RViewsService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[x]);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
remote.setRemoteAdapter(R.id.list,intent);
remote.setEmptyView(R.id.list,R.id.empty);
remote.setTextViewText(R.id.title,Utilities.setDayOfWeek());
////////////////////////////////////////////////////////////////////////////////////////////////////////
Intent AddmateriaIntent = new Intent(context,AddMateria.class);
PendingIntent pendingItentForButtonAddMateria = PendingIntent.getActivity(context,0,AddmateriaIntent,0);
remote.setOnClickPendingIntent(R.id.add,pendingItentForButtonAddMateria);
remote.setOnClickPendingIntent(R.id.empty, pendingItentForButtonAddMateria);
appWidgetManager.updateAppWidget(appWidgetIds[x],remote);
}
super.onUpdate(context,appWidgetManager,appWidgetIds);
}
I could check and the method onUpdate
finish its job without errors.
And here is the RemoteViewService and RemoteViewsFactory they also don't show error on logCat.
public class RViewsService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new RViewFactory(getApplicationContext(),intent);
}
class RViewFactory implements RemoteViewsFactory {
private DBAdapter adapter;
private ArrayList<Materia> materias;
private Context context;
public RViewFactory(Context context,Intent intent){
this.context = context;
}
@Override
public void onCreate() {
adapter = new DBAdapter(context).openReadableDatabase();
materias = new ArrayList<Materia>();
Cursor cursor = adapter.query(Utilities.setDayAndTable(), new String[]{DBAdapter.ROW_SUBJECT,DBAdapter.ROW_COLOR_NAME,DBAdapter.ROW_COLOR_HEX}, null, null, null, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
while (!cursor.isAfterLast()) {
Materia materia = new Materia();
materia.setSubject(cursor.getString(cursor.getColumnIndex(DBAdapter.ROW_SUBJECT)));
materia.setColor(new ColorObject(cursor.getString(cursor.getColumnIndex(DBAdapter.ROW_COLOR_NAME)),
(cursor.getInt(cursor.getColumnIndex(DBAdapter.ROW_COLOR_HEX)))));
materias.add(materia);
Log.d("log", "Data: " + materia.getSubject());
cursor.moveToNext();
}
}
cursor.close();
}
}
@Override
public void onDataSetChanged() {
}
@Override
public void onDestroy() {
materias = null;
adapter.close();
}
@Override
public int getCount() {
return materias.size();
}
@Override
public RemoteViews getViewAt(int i) {
RemoteViews remote = new RemoteViews(context.getPackageName(),android.R.layout.simple_list_item_1);
remote.setTextViewText(android.R.id.text1,materias.get(i).getSubject());
remote.setTextColor(android.R.id.text1,materias.get(i).getColor().getColor());
return remote;
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 0;
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public boolean hasStableIds() {
return false;
}
}
}
And in the LogCat i cant find error or warnings when the Widget is loading, it only show when the cursor is being read (i've erased text from the LogCat because it was about the GC).
Logcat
05-02 12:54:30.796 21885-21885/schooltimetable.app D/cannon﹕ Data: Math
05-02 12:54:30.806 21885-21885/schooltimetable.app D/cannon﹕ Data: Theory
And i'm sure that the Cursor returns de data because i've log it in Logcat and it did as shown above.
And this is the Manifest snippet declaring the AppWidgetProvider and RemoteViewService:
<receiver android:name="schooltimetable.app.appWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/cannon_widget" />
</receiver>
<service android:name=".RViewsService" android:permission="android.permission.BIND_REMOTEVIEWS"/>
I'm testing my app on Nexus 7 (2012) : Android 4.4.2
Thanks.