2016-10-04 2 views
1

Je crée un appwidget avec une liste. In RemoteViewsFactory classe Je remplis la liste à partir de la base de données SQLite. Tout est très bien, mais si je mets une chaîne dans méthode updateWidget() que je reçois IndexOutOfBoundsException dans une méthode getViewAt de RemoteViewsFactory.Pourquoi j'obtiens IndexOutOfBoundsException dans une RemoteViewsFactory?

Il n'y a aucune raison pour laquelle cela cause une exception. Parce que dans updateWidget() méthode que je définis le texte à une seule vue à distance.

Voici une liste de code et chaîne qui causent un problème:

static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) 
{ 
    SharedPreferences sPreferences = context.getSharedPreferences("WidgetSettings_"+appWidgetId,0); 
    RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.initial_layout); 
    DBHelper dbHelper = DBHelper.getInstance(context); 

    // To avoid Exception in a RemoteViewsFactory.getViewAt() method just comment or delete this line 
    rv.setTextViewText(R.id.textViewListTotal, "Total sum of items"); // this line cause an Exception. If I commenting it then all is OK 


    final Intent intent = new Intent(context, WidgetRemoteViewsService.class); 
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
    intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
    rv.setRemoteAdapter(appWidgetId, R.id.items_list, intent); 

    rv.setEmptyView(R.id.items_list, R.id.empty_view); 

    final Intent actionIntent = new Intent(context, WidgetProvider.class); 
    actionIntent.setAction(WidgetProvider.ACTION_MANAGE); 
    actionIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
    actionIntent.setData(Uri.parse(actionIntent.toUri(Intent.URI_INTENT_SCHEME))); 
    PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 0, actionIntent, 
      PendingIntent.FLAG_UPDATE_CURRENT); 
    rv.setPendingIntentTemplate(R.id.items_list, actionPendingIntent); 

    appWidgetManager.updateAppWidget(appWidgetId, rv); 
    appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.items_list); 
} 

Répondre

0

je fait cela avec une solution connue. Dans une méthode getViewAt je colle une déclaration de vérification comme ceci:

@Override 
public RemoteViews getViewAt(int position) { 

    RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.list_item); 

    try { 
     if(ListItems.size() > 0) //<------- avoid indexoutofbound exception 
     { 
      // doing something with a remoteviews 
     } 
    } 
    catch (IndexOutOfBoundsException e) 
    { 
     e.printStackTrace(); 
    } 

    return rv; 
} 
+1

Je ne sais pas ce qu'est un bug est-il. Si quelqu'un sait, veuillez poster votre solution – Trancer