android - 将两个 NumberPicker View 与 onValueChanged 链接会导致不可预测的崩溃

标签 android

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

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出现数组索引越界异常,一行与我传入的字符串数组有关。我在上面的更新代码中设置了一个断点,并验证了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 并不是一个真正的字符串选择器,所以如果有人对如何实现这种 UI 有更好的建议,我会洗耳恭听。否则,我将尝试实现某种去抖动器,以便在组选择器上的所有 Activity 完成后更新项目选择器。

最佳答案

当你多次 setDisplayedValue(String[]) 时会发生这种情况。

如果 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);

关于android - 将两个 NumberPicker View 与 onValueChanged 链接会导致不可预测的崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24140176/

相关文章:

java - 如何使用Material组件的Slider显示标签?

android - 如何在 MPAndroidChart 中添加 float x 和 float y 值

android - 为什么相机预览不起作用

android - Facebook 和 twitter 与我的 android 应用程序集成

java - 录制时流式传输 MediaRecorder 文件

ANDROID FACEBOOK SDK-4.0 : I get an error when i use "/me?fields=age_range" in my GraphRequest. newGraphPathRequest

android - 如果 Android Hilt 都可以与 SingletonComponent 一起工作,为什么要对 Android Hilt 使用不同的范围

android - 如何在android中的通知中打开应用程序?

android - 在没有android :exported=false的情况下使NFC Activity 私有(private)

java - android - onactivity结果viewpager