1

以前のスピナーの選択に基づいて、いくつかのスピナーを動的に変更しようとしています。リストを更新できますが、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) {}
    }
}

ご覧のとおり、ブーリアン フラグを使用して、スピナーが作成されたばかりかどうかを判断しようとしましたが、選択を変更すると、スピナーが死んでしまいます。

4

2 に答える 2

7

あなたはおそらく を取得してい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);
于 2012-05-08T19:47:21.827 に答える
0

ああ、あなたが数時間前と同じ問題を抱えているなんて信じられない。私はすでにこれに関するバグを報告しました:バグレポート

問題は、コンストラクターに配列を渡すと、実際には、配列の代わりにリストを受け取る他のコンストラクターオーバーロードを呼び出すことArrays.asList(array)です。ただし、このメソッドはバッキング配列のビューのみを返すため、リストへの要素の追加と削除はできません。必要に応じて、Androidの問題追跡システムでバグレポートにスターを付けることができます。

たとえば、ここでArrayAdapterクラスのコードを表示することもできます

于 2012-05-08T19:52:08.080 に答える