经常使用的ArrayAdapter 的构造函数:
ArrayAdapter(Context, int, List)
ArrayAdapter(Context, int, Object[])
在ArrayAdapter 类内部,构造函数 ArrayAdapter(Context, int, Object[]) 第三个参数是转化为List的
public ArrayAdapter(Context context, int resource, T[] objects) { 128 init(context, resource, 0, Arrays.asList(objects)); 129 }
private void init(Context context, int resource, int textViewResourceId, List<T> objects) { 309 mContext = context; 310 mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 311 mResource = mDropDownResource = resource; 312 mObjects = objects; 313 mFieldId = textViewResourceId; 314 }
List<T> 类型的 objects 会赋值给mObjects,mObjects 是一个List<T> 的私有变量。ArrayAdapter 的clear(), add(), addAll()等函数方法,会处理
mObjects 私有变量,而当使用构造函数ArrayAdapter(Context, int, Object[])时,调用adapter 的clear(), add(), addAll()方法会抛出
java.lang.UnsupportedOperationException 异常。原因在于使用Arrays.asList()后调用add,remove这些method时出现java.lang.UnsupportedOperationException异常。这是由于Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList,remove,add等method在AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。ArrayList override这些method来对list进行操作,但是Arrays$ArrayList没有override remove(),add()等,所以throw UnsupportedOperationException。
解决方法是采用构造方法ArrayAdapter(Context, int, List), 第三个参数传入ArrayList, 将Objects[] 转化为 ArrayList,
new ArrayList(Arrays.asList(objects))