2012-05-08 18 views
0

私は、以前のスピナー選択に基づいて動的に変更するカップルスピナーを取得しようとしています。リストを更新できますが、adapter.clear()を使用するとクラッシュします。あなたは、私はスピナーが作成したかではないが、私は選択を変更するとき、それは死ぬされているかどうかを判断するブール値のフラグを使用してみました見ることができるようにadapter.clear()がアンドロイドアプリをクラッシュさせます

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemSelectedListener; 
import android.widget.ArrayAdapter; 
import android.widget.Spinner; 
import android.widget.TextView; 

public class CarKitsAct extends Activity{ 

    ArrayAdapter<String> adMod, adEd; 
    String[] models, edition; 
    Boolean initSpMan = true; 
    Boolean initSpMod = true; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.carkitslayout); 

    // Construct TextViews 
     TextView textMan = (TextView) findViewById(R.id.textMan); 
     textMan.setText(R.string.selectmanufacturer); 
     TextView textMod = (TextView) findViewById(R.id.textMod); 
     textMod.setText(R.string.selectmodel); 
     TextView textEd = (TextView) findViewById(R.id.textEd); 
     textEd.setText(R.string.selectedition); 

    // Construct Spinners 
     Spinner spMan = (Spinner) findViewById(R.id.spMan); 
     Spinner spMod = (Spinner) findViewById(R.id.spMod); 
     Spinner spEd = (Spinner) findViewById(R.id.spEd); 

    // Construct Manufacturer Spinner Adapter 
     ArrayAdapter<CharSequence> adMan; 
     adMan = ArrayAdapter.createFromResource(this, R.array.cars, android.R.layout.simple_spinner_item); 
     adMan.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spMan.setAdapter(adMan); 

    // Set initial values for model and edition spinners 
     models = getResources().getStringArray(R.array.AC); 
     edition = getResources().getStringArray(R.array.ACAcceca); 

    //Construct adapters for models and editions 
     adMod = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, models); 
     adMod.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     adMod.setNotifyOnChange(true); 
     spMod.setAdapter(adMod); 

     adEd = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, edition); 
     adEd.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     adEd.setNotifyOnChange(true); 
     spEd.setAdapter(adEd); 

    // Set up listeners for item selection 
     spMan.setOnItemSelectedListener(new ManItemSelectedListener()); 
    } 

    public class ManItemSelectedListener implements OnItemSelectedListener { 
     public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
      if (initSpMan == true) { 
       initSpMan = false; 
      } else { 
       models = getResources().getStringArray(2130968577 + pos); 
       adMod.clear(); 
       adMod.addAll(models); 
       adMod.notifyDataSetChanged();    
      } 
    } 
     public void onNothingSelected(AdapterView<?> parent) {} 
    } 
} 

:ここに私のコードです。

+1

例えばArrayAdapterクラスhereのコードを表示することができます。生成されているエラーを確認すると、診断が容易になります。 – Gophermofur

答えて

4

おそらくUnsupportedOperationExceptionが表示されています。これは、アダプターがオブジェクトの配列で初期化され、内部的には変更できないAbstractListに変換されるためです。

問題を解決するには、アダプタにList<?>インターフェイスを実装するものを入力するだけです。例:

String[] strings = getResources().getStringArray(R.array.cars); 
List<String> items = new ArrayList<String>(Arrays.asList(strings)); 
ArrayAdapter<String> adMan = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, items); 
+0

ジェネリックの不適切な使用のためにあなたの例はコンパイルされません。 – asenovm

+0

ありがとうございます。これは実際に私のために働いた。 宣言を変更しました。 'String [] modStr、edStr; リストモデル、エディション; ' と ' modStr = getResources()。getStringArray(R.array.AC); モデル=新しいArrayList (Arrays.asList(modStr)); edStr = getResources()。getStringArray(R.array.ACAcceca); edition = new ArrayList (Arrays.asList(edStr)); および modStr = getResources()。getStringArray(2130968577 + pos); モデル=新しいArrayList (Arrays.asList(modStr)); adMod.clear(); adMod.addAll(models); adMod.notifyDataSetChanged(); ' – jimmygoska

+1

@MartinAsenov:それを指摘してくれてありがとう。これは、IDEの代わりにコードをコピーアンドペーストしてブラウザに直接入力することによって得られます。それを修正しました。ちなみに次回は自分で修正してください。つまり、それが編集システム全体の目的ですね。 :) –

0

私は数時間前と同じ問題があるとは思わない。 bug report

この問題は、コンストラクタに配列を渡すと、配列の代わりにArrays.asList(array)というリストを取る別のコンストラクタのオーバーロードが実際に呼び出されるという問題があります。ただし、このメソッドは、ビューをバッキング配列に返します。したがって、リストに要素を追加および削除することはできません。あなたが気に入ったら、アンドロイドの問題追跡ツールでバグレポートにスターを付けることができます。

また、あなたのlogcatエラーを投稿

+0

ありがとうございます。スター付き – jimmygoska

関連する問題