Widget de Android con ListView no carga elementos correclty

Estoy intentando implementar un widget para mi aplicación con ListView.

Para ello, he ido paso a paso en todos los siguientes enlaces:

  • Widget de la aplicación de Android con vista de lista
  • Uso de los widgets de aplicaciones con colecciones – developer.android.com/guide/topics/appwidgets/index.html#collections
  • Llenando ListView en el widget de pantalla de inicio en Android – stackoverflow.com/questions/14121602/filling-listview-in-homescreen-widget-in-android

Sin embargo, cuando coloco el widget en la pantalla de inicio, el número de elementos de lista coincide con el número de elementos que tengo en la base de datos, pero la vista de cada fila no se actualiza y sigue mostrando "Cargando …" (como se muestra en Esta captura de pantalla )

No entiendo lo que falta.

Muchas gracias por su ayuda!

Aquí está mi AppWidgetProvider:

package com.appro.illbeback; import com.appro.illbeback.R; import com.appro.illbeback.data.CallsDataSrouce; import android.app.PendingIntent; 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 CallsAppWidgetProvider extends AppWidgetProvider { private CallsDataSrouce dataSource; @SuppressWarnings("deprecation") @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) { dataSource = new CallsDataSrouce(context); dataSource.open(); for (int i = 0; i < appWidgetIds.length; i++) { Intent serviceIntent = new Intent(context, WidgetService.class); serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME))); // Which layout to show on widget RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); // Setting the adapter for listview of the widget remoteViews.setRemoteAdapter(appWidgetIds[i], R.id.listViewWidget, serviceIntent); // Setting an empty view in case of no data remoteViews.setEmptyView(R.id.listViewWidget, R.id.empty_view); // Application Launcher Intent launchActivity = new Intent(context, Main.class); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, launchActivity, 0); remoteViews.setOnClickPendingIntent(R.id.imageViewAppLauncher, pendingIntent); // Number of Calls Text String numOfCallsText = dataSource.getNumberOfCalls() + " Calls"; remoteViews.setTextViewText(R.id.textViewNunberOfCalls, numOfCallsText); appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews); } super.onUpdate(context, appWidgetManager, appWidgetIds); } } 

Aquí está RemoteViewsService:

 public class WidgetService extends RemoteViewsService { @Override public RemoteViewsFactory onGetViewFactory(Intent intent) { RemoteViewsFactory listProvidder = new CallsListRemoteViewsFactory(this.getApplicationContext(), intent); return listProvidder; } } 

Aquí está mi RemoteViewFactory:

 package com.appro.illbeback; import java.util.List; import com.appro.illbeback.R; import com.appro.illbeback.data.CallItem; import com.appro.illbeback.data.CallsDataSrouce; import android.content.Context; import android.content.Intent; import android.widget.RemoteViews; import android.widget.RemoteViewsService; public class CallsListRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory { private CallsDataSrouce mDataSource; private List<CallItem> mCallsList; private Context mContext = null; public CallsListRemoteViewsFactory(Context context, Intent intent) { this.mContext = context; } @Override public int getCount() { return mCallsList.size(); } @Override public long getItemId(int position) { return mCallsList.get(position).getId(); } @Override public RemoteViews getViewAt(int position) { RemoteViews row = new RemoteViews(mContext.getPackageName(), R.layout.widget_list_row_layout); CallItem callItem = mCallsList.get(position); String contactID = callItem.getContactID(); if (!contactID.equals(CallItem.CONTACT_ID_UNKOWN)) { row.setTextViewText(R.id.textViewWidgetContactName, callItem.getName()); } else { row.setTextViewText(R.id.textViewWidgetContactName, callItem.getNumber()); } return row; } @Override public RemoteViews getLoadingView() { return null; } @Override public int getViewTypeCount() { return 0; } @Override public boolean hasStableIds() { return false; } @Override public void onCreate() { mDataSource = new CallsDataSrouce(mContext); mDataSource.open(); mCallsList = mDataSource.findAllCalls(); } @Override public void onDataSetChanged() { mCallsList = mDataSource.findAllCalls(); } @Override public void onDestroy() { } } 

Puede comprobar si hay vistas en su diseño que no son compatibles con RemoteViews ( http://developer.android.com/guide/topics/appwidgets/index.html#collections ). Tuve el mismo problema debido a una casilla de verificación en el diseño del elemento de lista. Después de quitarlo, la lista se mostró correctamente.

Encontramos la solución !!! El problema fue con mi RemoteViewsService. La función getViewTypeCount devolvió '0' en lugar de '1'.

Explicación de getViewTypeCount

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.