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

Android ArrayList洗牌后设置TextView崩溃,求修复建议

修复ClassCastException并优化洗牌逻辑的方案

首先,咱们直接戳中核心问题:你碰到的java.lang.ClassCastException,是因为**TextView.setText()根本不接受ArrayList类型的参数**,你强行把ArrayList转成CharSequence肯定会触发类型转换错误。另外你的洗牌逻辑也有小问题——每次循环加一个元素就洗牌,完全没必要,应该等所有数字都加入集合后再一次性洗牌。

具体修复步骤:

  • 调整洗牌时机:把Collections.shuffle(kocok);移到for循环外面,等所有数字都添加到ArrayList之后再执行洗牌,这样才能得到完整的随机序列。
  • 将ArrayList转为字符串:用String.join()方法把集合里的元素拼接成可读的字符串(比如用逗号分隔),再传给setText(),这才是TextView能识别的参数类型。

修复后的完整代码:

@SuppressLint("SetTextI18n") 
public void kocokAjah (View view) { 
    TextView textViewCard = findViewById(R.id.textViewCard); 
    relativeLayoutGone.setVisibility(View.INVISIBLE); 
    textViewCard.setVisibility(View.VISIBLE); 

    // 建议添加异常处理,避免输入非数字导致崩溃
    try {
        int MyFirstNumber = Integer.parseInt(editNumBegin.getText().toString()); 
        int MyLastNumber = Integer.parseInt(editNumEnd.getText().toString()); 

        ArrayList<String> kocok = new ArrayList<>(); 
        // 先把所有数字批量加入集合
        for (int i = MyFirstNumber; i <= MyLastNumber; i++) { 
            kocok.add(Integer.toString(i)); 
        }
        // 一次性完成洗牌操作
        Collections.shuffle(kocok); 
        // 将集合元素拼接成字符串,用逗号分隔(可根据需求改成换行符"\n")
        String shuffledText = String.join(", ", kocok);
        textViewCard.setText(shuffledText); 
    } catch (NumberFormatException e) {
        // 处理输入无效的情况,给用户明确提示
        textViewCard.setText("请输入有效的数字范围!");
        e.printStackTrace();
    }
}

额外优化小建议:

  • 可以加个判断,检查MyFirstNumber是否小于等于MyLastNumber,避免出现循环不执行的空内容情况。
  • 如果希望每个数字单独占一行,把String.join()里的分隔符改成"\n"即可。

内容的提问来源于stack exchange,提问作者Fernando Sinaga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:34:02