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

呵呵,不敢相信你遇到了和我几个小时前一样的问题。我已经报告了一个关于此的错误:错误报告

问题在于,当您将数组传递给构造函数时,它实际上调用了另一个构造函数重载,该重载采用 List 而不是 Array with Arrays.asList(array)。但是,此方法仅返回支持数组的视图,因此不允许在列表中添加和删除元素。如果您愿意,可以在 android 问题跟踪器中为错误报告加注星标。

例如,您还可以在此处查看ArrayAdapter 类的代码

于 2012-05-08T19:52:08.080 回答