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".
На данный момент мне не нужно использовать этот способ сделать это, я просто хочу что-то, что работает. Не может быть так сложно заставить сборщик чисел пропустить вперед, или так?
Заранее спасибо.