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

Android Studio中List<Integer>调用add方法致应用崩溃求助

问题分析与解决方案

嘿,我一下子就找到你崩溃的原因啦!

核心问题:固定大小的List无法执行add操作

你在ViewHolder里用Arrays.asList(1,2,5)初始化了intList,但Arrays.asList()返回的是一个固定大小的列表——它的底层是数组实现,不支持add()、remove()这类修改列表长度的操作,所以当你调用viewHolder.intList.add(position)时,就会抛出UnsupportedOperationException,直接导致应用崩溃。

快速修复:换成可修改的ArrayList

把初始化代码改成下面两种方式之一,就能解决崩溃问题:

  1. 将Arrays.asList的结果包装成ArrayList:
List<Integer> intList = new ArrayList<>(Arrays.asList(1,2,5));
  1. 直接初始化ArrayList并添加初始元素:
List<Integer> intList = new ArrayList<>();
intList.add(1);
intList.add(2);
intList.add(5);

额外优化:选中状态的正确存储方式

另外还有个重要的小提醒——你把记录选中位置的集合放在ViewHolder里是不合理的!因为ListView的ViewHolder是会被复用的,滚动时旧的ViewHolder会被拿来显示新的Item,这样很容易导致选中状态混乱。

正确的做法是把这个选中集合放在Adapter的成员变量里,示例代码如下:

public class YourAdapter extends BaseAdapter {
    // 数据源
    private List<String> mItemData;
    // 存储选中的位置,放在Adapter里而非ViewHolder
    private List<Integer> mSelectedPositions = new ArrayList<>(Arrays.asList(1,2,5));

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.your_item_layout, parent, false);
            holder = new ViewHolder();
            holder.favorite = convertView.findViewById(R.id.toggle_favorite);
            holder.text = convertView.findViewById(R.id.tv_item_text);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        // 根据集合设置ToggleButton的选中状态
        holder.favorite.setChecked(mSelectedPositions.contains(position));

        // 监听选中状态变化,更新集合
        holder.favorite.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    if (!mSelectedPositions.contains(position)) {
                        mSelectedPositions.add(position);
                    }
                } else {
                    mSelectedPositions.remove(Integer.valueOf(position));
                }
            }
        });

        holder.text.setText(mItemData.get(position));
        return convertView;
    }

    // ViewHolder只负责持有视图,不要存状态数据
    static class ViewHolder {
        ToggleButton favorite;
        TextView text;
    }
}

这样不仅能解决崩溃问题,还能保证ListView滚动时选中状态的准确性哦!

内容的提问来源于stack exchange,提问作者Jonáš Tichý

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:45:22