2017-10-01 7 views
0

私はいくつかのドロップダウンスピンを持つアプリケーションを持っています。そのうちのいくつかは、別のスピナーによって選択されたオプションに基づいてオプションを変更したいものです。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(); 

他のスピナーの内容の変更を指示することであるスピナー用onItemSelected()メソッドのケース内:これを行うに私の計画は入れていました。理論的には、2番目のスピナー(product_adapter)をクリアし、makeArray()(docで指定されたCharSequencesの配列を返す)によって作成された新しい配列をproduct_adapter.add(array [ i]).notifyDataSetChanged()を呼び出して形式化します。しかし、それは最初の行のアプリのクラッシュを打つと次のスタックトレースが得られます

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) 

は、なぜ私はこのエラーを取得していますし、どのように私はそれを修正することができますか?

編集:これは私がintially私は変更しようとしているスピナーを投入しています方法です:

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

編集2:だから私は馬鹿のビットです。私はタイムスピナー(意図したスピナー)ではなく製品スピナーを変更しようとしていたし、製品スピナーはvalues.xmlの配列から初期化されていた。おそらくそれ自身の中で自分自身を変更するのは好きではないでしょう。間接的な助けをいただきありがとうございます。私のコードでは、私が思考と不道徳に導きます。

+0

あなたの質問を編集し、 'ArrayAdapter'の入力方法を表示してください。 – CommonsWare

答えて

1

削除操作をサポートしていないリストコレクションを使用しています。

あなたは項目の配列を提供することにより、ArrayAdapterを構築している場合:それはよくある間違いである

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

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

Actual implementationArrays.asList()

修正を使用して固定長のリストを作成します。別のよくある間違いは不変のリストを提供することです。

+0

私はリストコレクションを使用していません。私はCharSequenceの配列を使用しています。 – Holmes

+0

また、この問題は、アダプターを再充填しようとする前に呼び出される.clear()を呼び出す際に問題が発生しているため、私が使用しているデータ構造とは無関係でなければなりません。 – Holmes

+0

私はそれが奇妙に聞こえるが、ArrayAdapterは提供された同じリストを使用していて、それは奇妙なバグを引き起こすことを知っている。実装では(https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/ArrayAdapter.java#L177)、arrayを使用すると[Arrays.asList ](https://developer.android.com/reference/java/util/Arrays.html#asList(T ...))は、固定長リストを作成します。つまり、サイズを変更することはできません(クリーン、削除)。私は答えを更新する – neworld

関連する問題