我在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);
但应用程序崩溃了。我能做什么? 谢谢!
答案 0 :(得分: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接口包装器实现,因此它不支持add opeation。为了能够使用适配器的add方法,您必须将支持数据作为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);
答案 1 :(得分: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);