ArrayAdapter 使用clear(), add(), addAll()等方法時拋出java.lang.UnsupportedOperationException


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM