經常使用的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))