android中adapter.clear()引起的错误

来源:互联网 发布:北京海洋馆客流量数据 编辑:程序博客网 时间:2024/06/07 03:53

public class MainActivity extends Activity implements OnClickListener {ArrayAdapter<String> adapter;@Overrideprotected 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() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view,int position, long id) {System.out.println(adapter.getItem(position));}@Overridepublic void onNothingSelected(AdapterView<?> parent) {System.out.println("nothing selected");}});Button btn = (Button) findViewById(R.id.btn);btn.setOnClickListener(this);}@Overridepublic void onClick(View v) {adapter.clear();}}

点击这里的Button,也就是执行onClick()之后,发生如下错误:

02-16 13:50:21.062: E/AndroidRuntime(29353): FATAL EXCEPTION: main02-16 13:50:21.062: E/AndroidRuntime(29353): java.lang.UnsupportedOperationException02-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:

含义就是这里如果使用数组传递到Adapter的话,则它会将这个转化为AbstractList,而这个AbstractList是不可以修改的。

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>();@Overrideprotected 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() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view,int position, long id) {System.out.println(adapter.getItem(position));}@Overridepublic void onNothingSelected(AdapterView<?> parent) {System.out.println("nothing selected");}});Button btn = (Button) findViewById(R.id.btn);btn.setOnClickListener(this);}@Overridepublic void onClick(View v) {datas.clear();adapter.notifyDataSetChanged();}}



0 0