Android GridView移除选中复选框对应ArrayList项报错如何解决
问题根因
你遇到的UnsupportedOperationException异常是因为你在MainActivity中通过Arrays.asList()方法将数组转为List时,得到的是固定长度的不可变列表,该列表是Arrays的内部实现类,不支持remove、add这类修改列表结构的操作,调用删除方法时就会抛出异常。
修复步骤
1. 替换可变列表初始化(核心修复)
修改MainActivity中onCreate方法里的列表初始化逻辑,将不可变列表转为支持修改的ArrayList:
// 替换原来的 websiteLocationList = Arrays.asList(websiteLocations); websiteLocationList = new ArrayList<>(Arrays.asList(websiteLocations));
2. 修复Adapter中的逻辑bug
① 补全复选框取消选中的逻辑
你当前的复选框点击事件只处理了勾选时添加到选中列表的逻辑,没有处理用户取消勾选时从选中列表移除的逻辑,会导致取消勾选的项依然被误删:
checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { WebsiteLocation currentItem = websiteLocations.get(position); if (checkBox.isChecked()){ selectedImages.add(currentItem); } else { selectedImages.remove(currentItem); } } });
② 优化删除按钮的监听逻辑
你现在把删除按钮的点击监听写在getView方法中,每加载一个GridView条目就会重复设置一次监听,会导致删除逻辑被多次执行。应该把按钮点击监听的逻辑移到Adapter的构造方法中,同时优化删除逻辑,删除后清空选中列表避免下次删除出错:
// GridAdapter构造方法内添加 public GridAdapter(Context context, List<WebsiteLocation> websiteLocations, ImageButton imagebutton){ this.context = context; this.websiteLocations = websiteLocations; this.button = imagebutton; // 在这里设置按钮点击监听 this.button.setOnClickListener(v -> { websiteLocations.removeAll(selectedImages); selectedImages.clear(); notifyDataSetChanged(); }); }
记得把原来写在getView里的按钮点击监听代码删掉。
③ 修正getItem方法的返回值
你当前getItem方法返回的是位置索引而不是对应条目对象,后续逻辑如果调用该方法会出错,修改为:
@Override public Object getItem(int position) { return websiteLocations.get(position); }
内容的提问来源于stack exchange,提问作者Tommy
相关产品推荐
相关产品推荐

