public class MainActivity extends Activity implements OnClickListener {
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.paomadeng);
Spinner spinner = (Spinner) findViewById(R.id.spinner);
String[] strArray = new String[]{"杭州","上海", "南京", "北京", "广州", "深圳"};
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_dropdown_item, strArray);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
System.out.println(adapter.getItem(position));
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
System.out.println("nothing selected");
}
});
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
adapter.clear();
}
}
点击这里的Button,也就是执行onClick()之后,发生如下错误:
02-16 13:50:21.062: E/AndroidRuntime(29353): FATAL EXCEPTION: main
02-16 13:50:21.062: E/AndroidRuntime(29353): java.lang.UnsupportedOperationException
02-16 13:50:21.062: E/AndroidRuntime(29353): at java.util.AbstractList.remove(AbstractList.java:638)
02-16 13:50:21.062: E/AndroidRuntime(29353): at java.util.AbstractList$SimpleListIterator.remove(AbstractList.java:75)
02-16 13:50:21.062: E/AndroidRuntime(29353): at java.util.AbstractList.removeRange(AbstractList.java:658)
02-16 13:50:21.062: E/AndroidRuntime(29353): at java.util.AbstractList.clear(AbstractList.java:466)
02-16 13:50:21.062: E/AndroidRuntime(29353): at android.widget.ArrayAdapter.clear(ArrayAdapter.java:258)
http://stackoverflow.com/questions/10504353/adapter-clear-crashes-android-app
You are probably getting an UnsupportedOperationException
, right? This is because the adapters get initialised with an array of objects, which it interally converts to an AbstractList
, which cannot be modified.
To solve your problem, you simply need to feed something that implements the List<?>
interface to the adapter. Example:
public ArrayAdapter(Context context, int resource, T[] objects) {
init(context, resource, 0, Arrays.asList(objects));
}
可以看到这里的源码是调用了Arrays.asList(),我们知道这个Arrays.asList()会返回一个不可修改的ArrayList,而且这个ArrayList是Arrays里面的。
正确的方式如下:
public class MainActivity extends Activity implements OnClickListener {
ArrayAdapter<String> adapter;
List<String> datas = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.paomadeng);
Spinner spinner = (Spinner) findViewById(R.id.spinner);
datas.add("杭州");
datas.add("上海");
datas.add("南京");
datas.add("北京");
datas.add("广州");
datas.add("深圳");
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_dropdown_item, datas);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
System.out.println(adapter.getItem(position));
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
System.out.println("nothing selected");
}
});
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
datas.clear();
adapter.notifyDataSetChanged();
}
}