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:
- Notificación de Android con RemoteViews: actividad asociada con el diseño de RemoteViews
- AppCompat 23.2 utiliza VectorDrawableCompat con RemoteViews (AppWidget) en la API <21
- Notificaciones de Remote View de Android
- Notificación para el reproductor de música android
- Android ¿Cómo setWeight de una RemoteView?
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?
- Color del fondo del framelayout del remoteview
- RemoteViews setViewVisibility en Android Widget
- Android Widget con ListView que muestra sólo vistas de carga
- ¿Es seguro confiar en la llamada a onDataSetChanged () después de onCreated () en RemoteViewsFactory de un AppWidget
- ¿Es posible agregar a los oyentes onclick a las vistas remotas en android
- No se pudo expandir RemoteViews para: StatusBarNotification
- Cómo puedo cambiar el tamaño de texto en RemoteViews
- RemoteViews (Widget) tiene texto difuso cuando se utiliza un mapa de bits
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()
- Android twitter4j autenticación a través de la aplicación de twitter instalado no navegador
- ¿Existe una manera de personalizar el umbral para el desplazamiento de ViewPager?