ArrayAdapter添加新项崩溃:Spinner动态添加数据时应用闪退排查
解决Spinner动态添加数据时的UnsupportedOperationException崩溃问题
这个问题我之前也踩过坑,根源其实很清晰:你从R.array.restrictions拿到的列表是不可修改的固定大小列表,当你尝试往里面追加Firebase加载的数据时,自然会触发UnsupportedOperationException。
问题本质
Android里调用Arrays.asList(getResources().getStringArray(R.array.restrictions))得到的是AbstractList的实现类,这个列表直接绑定原始字符串数组的大小,不支持add()、remove()这类会改变列表长度的操作——这就是崩溃的核心原因。
具体解决方案
只需要把这个不可变列表转换成支持动态修改的ArrayList就行,步骤如下:
将不可变列表转为可变类型
把原来的列表初始化代码:List<String> restrictionList = Arrays.asList(getResources().getStringArray(R.array.restrictions));修改为:
// 用ArrayList包装不可变列表,得到可扩容的可变列表 List<String> restrictionList = new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.restrictions)));正常执行数据加载与Adapter设置
之后就可以正常从Firebase拉取数据并添加到列表,再配置Spinner的Adapter:// 示例:从Firebase Firestore加载数据 FirebaseFirestore.getInstance().collection("your_target_collection") .get() .addOnSuccessListener(querySnapshot -> { for (QueryDocumentSnapshot doc : querySnapshot) { String newRestriction = doc.getString("your_field_name"); restrictionList.add(newRestriction); } // 初始化Adapter并设置给Spinner ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>( this, android.R.layout.simple_spinner_item, restrictionList ); spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); yourSpinner.setAdapter(spinnerAdapter); // 如果之前已经设置过Adapter,直接调用下面的方法更新即可 // spinnerAdapter.notifyDataSetChanged(); }) .addOnFailureListener(e -> { // 别忘了处理加载失败的情况 Log.e("SpinnerCrash", "Failed to load data from Firebase", e); });
补充说明
ArrayList的构造方法会把不可变列表里的元素复制到自己的内部可扩容数组中,这样后续的增删操作就不会再触发异常了。
内容的提问来源于stack exchange,提问作者Kyril Khaltesky
相关产品推荐
相关产品推荐

