从其他方法更新微调器

时间:2012-05-27 15:19:15

标签: android

我在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); 

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

2 个答案:

答案 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);