2014-06-10 7 views
7

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.

+0

Hai trovato una soluzione al tuo problema?Attualmente sto affrontando lo stesso numero – Tobrun

+2

Ho trovato una soluzione, prima di gestire l'onValueChange, chiamata setDisplayedValues ​​a null – Tobrun

+0

Ha funzionato anche per me. Non so perché, o se è una soluzione "buona", ma funziona. +1 – codah

risposta

7

Succede quando si impostaDisplayedValue (String []) molte volte.

quando la lunghezza della stringa successiva [] è maggiore rispetto a getMaxValue() corrente, si verifica un'eccezione!

La mia soluzione

uso

picker.setMaxValue(0); 

prima

picker.setDisplayedValues(stringArr); 

Il mio codice

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); 
+0

ohhh ... grazie mille per il motivo ... ma questa soluzione non funziona –

1

Se si utilizzano gli indici hanno cominciato dal 1 quindi utilizzare:

 int size = mData.getItemsForGroup(to-1).size(); 

Consente di cambiare secondo livello (se il valore corrente è superiore al massimo sarà impostato al nuovo massimo):

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

E cercare utilizzare i valori come indici, ovvero

 minValue=0 
     maxValue=strings.length-1 
Problemi correlati