Ho creato una finestra di dialogo contenente due viste NumberPicker. Il primo contiene un elenco di gruppi, la seconda contiene gli elementi dal gruppo selezionato:Il collegamento di due viste NumberPicker con onValueChanged causa arresti anomali imprevisti
Group Group Items
1 2: Group 2 Item 2
[2] [3: Group 2 Item 3]
3 4: Group 2 Item 4
sto agganciando dentro al setOnValueChangedListener nel primo NumberPicker per popolare la seconda 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);
}
});
Questo funziona in sostanza - fino a quando, in determinate circostanze, cambiando il gruppo un paio di volte può causare un crash nella classe NumberPicker, quando si impostano le stringhe setDisplayedValues.
L'errore è un indice di array dall'eccezione di limiti nel numeropiccolo per gli elementi, una riga da fare con l'array di stringhe passato. Ho impostato un punto di interruzione nel codice di aggiornamento sopra e verificato che la stringa la matrice è sempre la dimensione corretta per il numero di elementi impostati tra il valore minimo e massimo sul selettore di numeri, quindi questo mi ha bloccato.
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)
Sto per iniziare la lettura attraverso ciò che accade nel NumberPicker per capire se sto usando male, ma qualche suggerimento sarebbe il benvenuto. "ensureCachedScrollSelectorValue" mi fa pensare che ho bisogno di resettare il numeropicker in qualche modo prima di aggiornarlo con nuovi dati, ma non ne sono sicuro.
Qualcuno può vedere cosa sto facendo male qui?
Mi rendo conto che NumberPicker non è in realtà un raccoglitore di stringhe, quindi se qualcuno ha un suggerimento migliore su come ottenere questo tipo di interfaccia utente, sono tutto orecchie. In caso contrario, procederò lungo il percorso per tentare di implementare una sorta di debouncer, per aggiornare il selettore degli elementi una volta completata l'attività sul selettore di gruppo.
Hai trovato una soluzione al tuo problema?Attualmente sto affrontando lo stesso numero – Tobrun
Ho trovato una soluzione, prima di gestire l'onValueChange, chiamata setDisplayedValues a null – Tobrun
Ha funzionato anche per me. Non so perché, o se è una soluzione "buona", ma funziona. +1 – codah