Android 将两个NumberPicker视图与onValueChanged链接会导致不可预知的崩溃

Android 将两个NumberPicker视图与onValueChanged链接会导致不可预知的崩溃,android,Android,我创建了一个包含两个NumberPicker视图的对话框。第一个包含组列表,第二个包含所选组中的项目: Group Group Items 1 2: Group 2 Item 2 [2] [3: Group 2 Item 3] 3 4: Group 2 Item 4 我正在连接第一个NumberPicker中的setOnValueChangedListener以填充第二个NumberPicker mNu

我创建了一个包含两个NumberPicker视图的对话框。第一个包含组列表,第二个包含所选组中的项目:

Group         Group Items
  1            2: Group 2 Item 2
 [2]          [3: Group 2 Item 3]
  3            4: Group 2 Item 4
我正在连接第一个NumberPicker中的setOnValueChangedListener以填充第二个NumberPicker

  mNumberPickerGroup.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
        @Override
        public void onValueChange(NumberPicker numberPicker, int from, int to) {
            int size = mData.getItemsForGroup(to).size();
            String[] strings = mData.getItemTitlesForGroup(to);

            mNumberPickerItems.setMinValue(1);
            mNumberPickerItems.setValue(1);

            mNumberPickerItems.setMaxValue(size);
            mNumberPickerItems.setDisplayedValues(strings);

        }
    });
这基本上是有效的-直到在某些情况下,在设置setDisplayedValues字符串时,多次更改组可能导致NumberPicker类崩溃

该错误是items的numberpicker中的数组索引越界异常,这一行与我传入的字符串数组有关。我已经在上面的更新代码中设置了一个断点,并验证了字符串数组对于在数字选择器上设置的最小值和最大值之间的项数始终是正确的大小,所以这让我很困惑

  java.lang.ArrayIndexOutOfBoundsException: length=22; index=22
        at android.widget.NumberPicker.ensureCachedScrollSelectorValue(NumberPicker.java:1768)
        at android.widget.NumberPicker.initializeSelectorWheelIndices(NumberPicker.java:1583)
        at android.widget.NumberPicker.setMaxValue(NumberPicker.java:1390)
        at uk.co.my.app.fragments.GroupMarkUptoDialog.updateItemPicker(MarkUptoDialog.java:99)
我即将开始阅读NumberPicker中发生的事情,以确定我是否使用了错误的方法,但欢迎提供任何建议。“EnsureChedScrollSelectorValue”让我觉得在用新数据更新之前,我需要以某种方式重置numberpicker,但我不确定

有人知道我做错了什么吗


我意识到NumberPicker并不是一个真正的字符串选择器,所以如果有人对如何实现这种UI有更好的建议,我会洗耳恭听。否则,我将尝试实现某种去公告器,在组选择器上的所有活动完成后更新项目选择器。

当您多次设置DisplayedValue(String[])时,就会发生这种情况

如果字符串[]的长度大于当前getMaxValue(),则会发生异常

我的解决方案

使用

以前

picker.setDisplayedValues(stringArr);
我的代码

cityPicker.setMaxValue(0);
    try {
        cityPicker.setDisplayedValues(citySet.toArray(new String[citySet.size()]));
    } catch (Exception e) {
        Log.e("Ninja", "cityPicker.setDisplayedValues(citys) occurs Error. province is " + province);
    }
    cityPicker.setMaxValue(citySet.size() - 1);

如果使用从1开始的索引,则使用:

        int size = mData.getItemsForGroup(to-1).size();
使用此选项更改第二个选择器(如果当前值高于最大值,则将其设置为新的最大值):

并尝试使用值作为索引,即

        minValue=0 
        maxValue=strings.length-1

你找到解决问题的办法了吗?我目前面临着同样的问题。我找到了一个解决方案,在处理onValueChange之前,将setDisplayedValues调用为null也对我有效。不知道为什么,也不知道这是否是一个“好”的解决方案,但它是有效的+1ohh…非常感谢你的原因…但是这个解决方案不起作用谢谢你的评论,我已经多年没有写Android代码了^^。如果你有解决方案,你可以上传。
        int i = mNumberPickerItems.getValue();
        int max = strings.length;
        if (i > max)
            i = max;
        mNumberPickerItems.setMinValue(1);
        mNumberPickerItems.setMaxValue(1);
        mNumberPickerItems.setDisplayedValues(strings);
        mNumberPickerItems.setMaxValue(max);
        mNumberPickerItems.setValue(i);
        minValue=0 
        maxValue=strings.length-1