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