0

我在 OnCreate 方法中有一个以下 Spinner:

    spinnerArrayAdapter = new ArrayAdapter<String>(this,   android.R.layout.simple_spinner_item, accounts);
        spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // The drop down view
        spinner.setAdapter(spinnerArrayAdapter); 
        spinner.setOnItemSelectedListener(this);

我想在其他方法中向 Spinner 添加一些条目,如下所示:

spinnerArrayAdapter.add(value.toString());
spinner.setAdapter(spinnerArrayAdapter); 

但应用程序崩溃。我能做些什么?谢谢!

4

2 回答 2

1

你有两种可能性:

任何一个:

在您即将向适配器添加新记录的地方: spinnerArrayAdapter.add("Your new item"); spinnerArrayAdapter.notifyDataSetChanged();

或者:

在初始化适配器时的 onCreate 中添加spinnerArrayAdapter.setNotifyOnChange(true); 当您想稍后将记录添加到适配器时只需调用spinnerArrayAdapter.add("Your new item");. 无需调用notifyDataSetChanged(),因为它已被add内部调用。

在这两种情况下,您都不必将适配器重新分配给微调器。

如果您使用数组初始化适配器,则 add 方法将引发异常,因为适配器内部存储的内容(List<T>) Arrays.asList(objects)objects您在构造函数中提供的数组。asList返回数组上的 List 接口包装器实现,因此它不支持添加操作。为了能够使用适配器的添加方法,您必须将支持数据作为列表提供,并带有支持的添加/删除方法 - 我建议使用 ArrayList。

所以在你的情况下,它是这样初始化的:

spinnerArrayAdapter = new ArrayAdapter<String>(
        this, android.R.layout.simple_spinner_item, 
        new ArrayList<String>(Arrays.asList(accounts)));

或更长但更有效(例如,您不会创建稍后放弃的开销列表对象)

final int length = accounts.length;
ArrayList<String> backingData = new ArrayList<String>(length);
for(int i=0; i<length; i++) {
    backingData.add(i, accounts[i]);
}
spinnerArrayAdapter = new ArrayAdapter<String>(
        this, android.R.layout.simple_spinner_item, backingData);
于 2012-05-27T16:30:19.640 回答
0

这可能有效...

ArrayList<String> accounts = new ArrayList<String>(Arrays.asList("Item A", "Item B"));
ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this, R.layout.list_item, accounts);

spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerArrayAdapter.add("Item C");
spinnerArrayAdapter.setNotifyOnChange(true);

spinner.setOnItemSelectedListener(this);
spinner.setAdapter(spinnerArrayAdapter);
于 2012-05-27T15:46:04.443 回答