RemoteViewsFactory llamado getViewAt cuando el dataset vacío

Estoy trabajando en el widget para mi aplicación que basado en StackView y debe mostrar algunos elementos. La cuenta de artículos puede variar debido a las acciones del usuario – digamos que es algún tipo de menú de favoritos. He implementado RemoteViewsFactory descendiente para generar vistas para StackView:

public class StackRemoteViewsFactory implements RemoteViewsFactory { private List<Item> data; private Context context; public StackRemoteViewsFactory(Context context) { this.context = context; data = new DAO(context).getFavouriteCards(); } @Override public void onDataSetChanged() { data = new DAO(context).getWidgetItems(); // refresh widget dataset } @Override public int getCount() { return data.size(); } @Override public RemoteViews getViewAt(int position) { Item item = data.get(position); // this is my problem and will be explained below - // here I'm getting IndexOutOfBoundsException, position = 0 ... } // I have omitted other methods to avoid verbosity } 

Todo funciona bien al principio widget start – widget muestra con éxito la vista vacía y todo va bien. Después de agregar algún elemento nuevo a los favoritos, notifico AppWidgetManager inmediatamente:

 AppWidgetManager widgetManager = AppWidgetManager.getInstance(getActivity()); ComponentName component = new ComponentName(getActivity(), MyWidgetProvider.class); int[] widgetIds = widgetManager.getAppWidgetIds(component); widgetManager.notifyAppWidgetViewDataChanged(widgetIds, R.id.widgets_stack); 

Todo está bien en este punto – conjunto de datos cambiado con éxito y veo mi elemento favorito en widget. Pero cuando quito mi solo elemento de los favoritos y los favoritos se convierten en vacío (AppWidgetManager notificado por supuesto) Recibo IndexOutOfBoundsException en mi getViewAtMethod:

 10-15 17:26:36.810: E/AndroidRuntime(30964): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 

En primer lugar he comprobado qué getCount() después de onDataSetChanged() incendios – era 0. Así que no entiendo por qué RemoteViewsFactory llamadas getViewAt() cuando getCount() devuelve 0. En la medida de lo que entiendo, RemoteViewFactory es como Un adaptador habitual por lo que este comportamiento es completamente confuso. Así que quizás mis sugerencias sobre él son incorrectas y estoy haciendo algo mal?

ACTUALIZAR
Hoy he cambiado mi diseño de widget para usar ListView vez de StackView mientras intento arreglar un bug gui. Y todo funciona bien ahora. Otro experimento muestra que AdapterViewFlipper tiene el mismo problema que StackView. Por lo que he entendido hay algunos aspectos que trabajan con los descendientes de AdapterViewAnimator – alguien puede confirmar / refutar mi suposición?

El mismo problema aqui. Dado que la solución aún no viene (Android 4.4 aquí y todavía sucede), creo que la mejor solución por el momento es básicamente una solución para evitar el bloqueo. Algunos desarrolladores lo llaman "hack" …

Por ahora:

 public RemoteViews getViewAt(int position) { if (position >= getCount()) return getLoadingView(); } //.... Rest of your normal configuration } 

Asegúrese de devolver una vista correctamente en getLoadingView()

  • ¿Cómo crear una notificación con una vista personalizada, pero con una apariencia nativa?
  • Obtener el ancho del panel de notificaciones de Android
  • Cómo hacer referencia a una vista en una notificación personalizada
  • Las vistas de StackedWidget no se muestran
  • Pasar objeto personalizado parcelable extra o en ArrayList a RemoteViewsService rompe appwidget
  • ¿Cómo utilizar Glide en remoteViews?
  • Android ListView en el widget onClick no funciona
  • Cómo cambiar el atributo 'android: autoStart' de ViewFlipper en RemoteViews mediante programación?
  • Cómo cambiar la imagen en el widget de la aplicación mediante programación en android
  • Manera fiable de recuperar los detalles de StatusbarNotification (título, texto de notificación)
  • No se pudo expandir RemoteViews - Notificación incorrecta
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.