You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:06:03