【问题标题】:IndexOutOfBoundsException with Spinner and setOnItemSelectedListener带有 Spinner 和 setOnItemSelectedListener 的 IndexOutOfBoundsException
【发布时间】:2014-09-13 03:40:16
【问题描述】:

我找不到导致 IndexOutOfBoundsException 的错误。

我用一个简单的 Arrayadapter 设置了一个 Spinner。我正在将文件夹 als 数组中的文件名添加到我的 ArrayAdapter。直到现在,当我从删除其中一个文件的另一项活动中恢复时,这一直有效。

现在每次我启动应用程序时都会抛出异常,我无法找出它崩溃的原因。

这是我设置 Spinner 的方法:

private void setupSpinner(final Context ctx) {
        final Context context = ctx;
        navSpinner = (Spinner)findViewById(R.id.nav_spinner);
        navSpinnerAdapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item, FileUtilities.getProjectNames());
        navSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        navSpinner.setAdapter(navSpinnerAdapter);
        navSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                pdfView.recycle();
                String path = FileUtilities.PFAD_PROJEKTE+"/"+parent.getItemAtPosition(position).toString();
                gewaehlteProjekte = new ArrayList<String>();
                gewaehlteProjekte.add(path);
                SharedPreferences.Editor editor = sharedPref.edit();
                editor.putInt(SettingsActivity.KEY_PREF_PROJECT, position);
                editor.commit();
                new updatePresentationFolder(context).execute();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
        if(sharedPref.contains(SettingsActivity.KEY_PREF_PROJECT)) {
            navSpinner.setSelection(sharedPref.getInt(SettingsActivity.KEY_PREF_PROJECT, 0));
        }
    }

这里是我的 Stacktrace:

我唯一发现的是,这发生在我设置 on item selected listener 的行中。

07-22 13:01:59.230    9733-9733/lp.german.bischofshofpresenter.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3
            at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
            at java.util.ArrayList.get(ArrayList.java:304)
            at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:337)
            at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:390)
            at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
            at android.widget.Spinner.makeAndAddView(Spinner.java:390)
            at android.widget.Spinner.layout(Spinner.java:341)
            at android.widget.Spinner.onLayout(Spinner.java:305)
            at android.view.View.layout(View.java:11283)
            at android.view.ViewGroup.layout(ViewGroup.java:4224)
            at android.widget.RelativeLayout.onLayout(RelativeLayout.java:925)
            at android.view.View.layout(View.java:11283)
            at android.view.ViewGroup.layout(ViewGroup.java:4224)
            at android.widget.RelativeLayout.onLayout(RelativeLayout.java:925)
            at android.view.View.layout(View.java:11283)
            at android.view.ViewGroup.layout(ViewGroup.java:4224)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
            at android.view.View.layout(View.java:11283)
            at android.view.ViewGroup.layout(ViewGroup.java:4224)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1399)
            at android.view.View.layout(View.java:11283)
            at android.view.ViewGroup.layout(ViewGroup.java:4224)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
            at android.view.View.layout(View.java:11283)
            at android.view.ViewGroup.layout(ViewGroup.java:4224)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1489)
            at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4424)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
            at dalvik.system.NativeStart.main(Native Method)

任何帮助表示赞赏;)

【问题讨论】:

    标签: android spinner android-arrayadapter indexoutofboundsexception


    【解决方案1】:

    您确定没有在偏好设置中保存 3 吗?

    【讨论】:

      【解决方案2】:

      当其中一个文件被删除时,是否选择了最后一个项目?如果是这样,以前选择的索引现在太大了。在使用 setDelection 的值之前,您应该检查一下。例如:

          if(sharedPref.contains(SettingsActivity.KEY_PREF_PROJECT)) {
              int selected = Math.min(navSpinnerAdapter.getCount() - 1, sharedPref.getInt(SettingsActivity.KEY_PREF_PROJECT, 0)
              navSpinner.setSelection(selected);
          }
      

      【讨论】:

      • 可能是被选中了
      • 您应该保护setSelection 免受旧(无效)值的影响,示例代码是一种可能的方法。
      【解决方案3】:

      我发现当使用超出范围的位置调用 AdaptergetView() 方法时,您应该注意两件事。第一个是您拨打setSelection() 的任何电话。正如@bwt 在评论中提到的那样,您应该始终检查您传递给setSelection() 的值,以确保它是Adapter 集合的有效索引,即> = 0 并且getProjectNames() 返回的当前项目列表不同步的 pref 值。

      要检查的另一件事是您的 getCount() 方法,如果您已覆盖 getCount()。虽然这不适用于这个特定问题,但我觉得值得一提的是,如果您确实覆盖 getCount(),请确保它不会与 Adapter 不同步数据。如果Adapter 正在管理动态数据集,这一点尤其重要。

      另一个可能有用的注释...如果您在getView() 方法中检查有效的位置参数,请不要通过返回null 来处理错误情况。这只会导致难以追踪的问题,例如来自android.widget.Spinner.setUpChild()NullPointerException

      【讨论】:

        猜你喜欢
        • 2019-10-24
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        • 2018-09-04
        • 1970-01-01
        相关资源
        最近更新 更多