Android: как заставить сборщик номеров пропускать номера

Я рассмотрел несколько потоков о том, как заставить программный выбор чисел изменяться программно, и запустить OnValueChangedListener. Никто из них не работает на меня. Мне нужно, чтобы сборщик чисел пропустил определенные номера, если они уже занесены в свободный слот. Мое текущее "решение" таково:

                // Set up channel picker change event to update other items in the form
            mPickerAddress.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
                @Override
                public void onValueChange(NumberPicker numberPicker, int i, int i1) {
                    // If the user scrolls the number picker, update the other form items
                    // Check to see if this channel is already used, and inform user, and reset picker
                    int n;
                    boolean contained = false;
                    // Iterate over each custom value to see if channel is used
                    for (n = 0; n < 10; n++) {
                        if (mCustomValues[n][0] == i1) {
                            contained = true;
                        }
                    }

                    if (contained) {
                        // Check direction being moved, if moving positive, skip over that way and vice versa
                        // If positive...
                        if(i1 - i > 0){
                            pickerSkipper(mPickerAddress,true);
                        }
                        else{
                            pickerSkipper(mPickerAddress,false);
                        }
                    } else {
                        // Update address value
                        mCustomValues[mPickerChannel.getValue() - 1][mCustomAddress] = i1;
                        // Update has changed
                        hasChanged[mPickerChannel.getValue() - 1] = true;
                    }
                }
            });

Метод пропуска (код, полученный из других сообщений по этому вопросу):

    // Skips forward or backward if a value is already taken
public void pickerSkipper(NumberPicker picker, boolean skip){
    Method method;
    try {
        // reflection call for
        // higherPicker.changeValueByOne(true);
        method = picker.getClass().getDeclaredMethod("changeValueByOne", boolean.class);
        method.setAccessible(true);
        if(skip)method.invoke(picker, true);
        else method.invoke(picker, false);

    } catch (final NoSuchMethodException e) {
        e.printStackTrace();
    } catch (final IllegalArgumentException e) {
        e.printStackTrace();
    } catch (final IllegalAccessException e) {
        e.printStackTrace();
    } catch (final InvocationTargetException e) {
        e.printStackTrace();
    }
}

Этот или любой другой способ настройки отражения метода приводит к аварийному завершению программы в бесконечной процедуре сборки мусора и "приостановке всех потоков: ошибки X.XXXms".

На данный момент мне не нужно использовать этот способ сделать это, я просто хочу что-то, что работает. Не может быть так сложно заставить сборщик чисел пропустить вперед, или так?

Заранее спасибо.

0 ответов

Другие вопросы по тегам