【问题标题】:Why I'm getting IndexOutOfBoundsException in a RemoteViewsFactory?为什么我在 RemoteViewsFactory 中得到 IndexOutOfBoundsException?
【发布时间】:2016-10-04 11:32:42
【问题描述】:

我创建了一个带有列表视图的 appwidget。 在 RemoteViewsFactory 类中,我从 SQLite 数据库填充列表。一切都很好,但是如果我在 updateWidget() 方法中放入一个字符串,而不是在 RemoteViewsFactory 的 getViewAt 方法中得到 IndexOutOfBoundsException

它没有逻辑为什么会导致异常。因为在 updateWidget() 方法中,我只将文本设置为一个远程视图。

这里是导致问题的代码列表和字符串:

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);
}

【问题讨论】:

    标签: java listview android-appwidget android-remoteview


    【解决方案1】:

    我使用已知的解决方案完成了此操作。在 getViewAt 方法中,我粘贴这样的检查语句:

    @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;
    }
    

    【讨论】:

    • 我不知道这是什么错误。如果有人知道,请发布您的解决方案
    猜你喜欢
    • 1970-01-01
    • 2017-04-21
    • 2014-07-04
    • 2016-07-19
    • 2019-03-05
    • 2018-11-01
    • 1970-01-01
    • 2023-01-02
    相关资源
    最近更新 更多