I am trying to create an Android widget containing a list of items (tasks).
When I place the widget on the desktop, it is empty, not a single task is displayed.
I do not understand what is missing.
Thanks in advance for your help.
Here is the xml for my widget_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/widget_background" android:orientation="vertical" > <TextView android:id="@+id/title" style="@android:style/TextAppearance.Medium" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="4dip" android:gravity="center_horizontal" android:text="@+string/TASK_LIST_ACT" > </TextView> <ListView android:id="@+id/list" style="@android:style/TextAppearance.Medium" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView>
This is the layout for ListView items.
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/widget_element" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?android:attr/listPreferredItemHeight" />
This is my widgetProvider class
package it.geotask.android.widget; import it.geotask.android.R; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.widget.RemoteViews; public class TaskWidgetProvider extends AppWidgetProvider { public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); for (int i = 0; i < appWidgetIds.length; ++i) { Intent intent = new Intent(context, GeotaskRemoteViewService.class); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout); rv.setRemoteAdapter(appWidgetIds[i], R.id.list, intent); rv.setEmptyView(R.id.list, R.id.empty_view); appWidgetManager.updateAppWidget(appWidgetIds[i], rv); } } }
And this is my RemoteViewsFactory
package it.geotask.android.widget; import it.geotask.android.R; import it.geotask.android.dto.Task; import it.geotask.android.service.TaskService; import java.util.ArrayList; import java.util.List; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; import android.widget.RemoteViews; import android.widget.RemoteViewsService; public class GeoTaskRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory { private Context context = null; private int appWidgetId; private List<Task> taskList = new ArrayList<Task>(); public GeoTaskRemoteViewsFactory(Context context, Intent intent) { this.context = context; appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); } public int getCount() { return taskList.size(); } public long getItemId(int position) { return taskList.get(position).getId(); } public RemoteViews getLoadingView() {
RemoteViewsService simply returns a factory instance.
EDIT: I forgot to declare the service in the manifest; now I get a widget filled with the correct number of elements, but with the message βloadingβ instead of the name of the element I want to display