2017-10-01 2 views
0

J'ai donc une application où j'ai plusieurs dérouleurs dont plusieurs dont je voudrais changer les options en fonction de l'option sélectionnée par un autre spinner. Mon plan pour ce faire était de mettre:Exception d'opération non supportée avec ArrayAdapter.clear()

product_adapter.clear(); 
CharSequence[] array=makeArray(urlMaker.getProductid()); 
for(int i=0;i<array.length;i++){ 
     product_adapter.add(array[i]); 
} 
product_adapter.notifyDataSetChanged(); 

dans un cas de la méthode onItemSelected() pour la fileuse qui est de dicter le changement de contenu de l'autre spinner. En théorie, l'idée est d'effacer le second spinner (product_adapter) puis d'ajouter un nouveau tableau créé par makeArray() (qui retourne un tableau de CharSequences comme spécifié dans le doc) à l'adaptateur du spinner en utilisant product_adapter.add (array [ i]) puis appelez .notifyDataSetChanged() pour le formaliser. Cependant, quand il frappe la première ligne les accidents d'application et donne la trace de la pile suivante:

E/AndroidRuntime: FATAL EXCEPTION: main 
      Process: com.example.benhouse.weatherview, PID: 25791 
      java.lang.UnsupportedOperationException 
       at java.util.AbstractList.remove(AbstractList.java:638) 
       at java.util.AbstractList$SimpleListIterator.remove(AbstractList.java:75) 
       at java.util.AbstractList.removeRange(AbstractList.java:658) 
       at java.util.AbstractList.clear(AbstractList.java:466) 
       at android.widget.ArrayAdapter.clear(ArrayAdapter.java:273) 
       at com.example.benhouse.weatherview.MainActivity$3.onItemSelected(MainActivity.java:102) 
       at android.widget.AdapterView.fireOnSelected(AdapterView.java:924) 
       at android.widget.AdapterView.dispatchOnItemSelected(AdapterView.java:913) 
       at android.widget.AdapterView.-wrap1(AdapterView.java) 
       at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:883) 
       at android.os.Handler.handleCallback(Handler.java:739) 
       at android.os.Handler.dispatchMessage(Handler.java:95) 
       at android.os.Looper.loop(Looper.java:148) 
       at android.app.ActivityThread.main(ActivityThread.java:5417) 
       at java.lang.reflect.Method.invoke(Native Method) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Pourquoi ai-je cette erreur et comment puis-je résoudre ce problème?

Edit: voilà comment je suis peuplant intially la fileuse que je suis en train de changer:

ArrayAdapter<CharSequence> T_spinnerAdapter = new ArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item, makeArray("GFS")); 
Time_spin.setAdapter(T_spinnerAdapter); 

Edit 2: Je suis un peu idiot. J'essayais de modifier le spinner du produit plutôt que le spinner temporel (le spinner prévu) et le spinner du produit est initialisé à partir d'un tableau dans le fichier values.xml. Aussi n'aime probablement pas se modifier en lui-même. Merci pour l'aide indirecte car elle m'a amené à réfléchir et à annuler mon code.

+0

Veuillez éditer votre question et montrer comment vous remplissez 'ArrayAdapter'. – CommonsWare

Répondre

1

Vous utilisez la collecte de liste qui ne prend pas en charge l'opération de suppression.

Si vous construisez ArrayAdapter en fournissant le tableau des éléments:

ArrayAdapter (Context context, 
       int resource, 
       T[] objects) 

Actual implementation crée la liste de longueur fixe en utilisant Arrays.asList()

Fix:

ArrayList list = new ArrayList(Arrays.asList(makeArray("GFS"))); 
new ArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item, list); 

Il est une erreur commune. Une autre erreur courante consiste à fournir une liste immuable.

+0

Je n'utilise pas de collection de listes. J'utilise un tableau de CharSequence. – Holmes

+0

Le problème ne devrait pas non plus être lié à la structure de données que j'utilise car j'ai des problèmes lors de l'appel de .clear() qui est appelé avant que j'essaie de repeupler l'adaptateur. – Holmes

+0

Je sais que cela semble bizarre, mais ArrayAdapter utilise la même liste que celle fournie et cela provoque des bogues étranges. Comme vous le voyez [dans l'implémentation] (https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/ArrayAdapter.java#L177), fournir array le convertit en utilisant [Arrays.asList ] (https://developer.android.com/reference/java/util/Arrays.html#asList (T ...)) qui crée une liste de longueur fixe. Cela signifie que vous ne pouvez pas modifier sa taille (nettoyer, supprimer). Je vais mettre à jour la réponse – neworld