我创建了一个包含两个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类崩溃。
错误是项目的numberpicker中的数组索引超出范围异常,是我传入的字符串数组的一行。我在上面的更新代码中设置了一个断点,并验证了String数组对于在数字选择器上的最小值和最大值之间设置的项目数量,总是正确的大小,所以这让我很难过。
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中发生的事情,以确定我是否使用它是错误的,但任何建议都会受到欢迎。 “ensureCachedScrollSelectorValue”让我觉得我需要在用新数据更新之前以某种方式重置numberpicker,但我不确定。
谁能看到我在这里做错了什么?
我意识到NumberPicker实际上不是一个字符串选择器,所以如果有人对如何实现这种UI有更好的建议,那我就听见了。否则,我正在试图实施某种去抖动的路线,在群组选择器上的所有活动完成后更新项目选择器。
答案 0 :(得分:9)
当你多次设置DisplayedValue(String [])时会发生这种情况。
当下一个字符串[]的长度比当前的getMaxValue()大时,会发生异常!
我的解决方案
使用
picker.setMaxValue(0);
前
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 :(得分:1)
如果您使用从1开始的索引,请使用:
int size = mData.getItemsForGroup(to-1).size();
使用此选项更改第二个选择器(如果当前值高于最大值,则将其设置为新的最大值):
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